有没有更pythonic的方式来使用多列表理解?

问题描述

有具有类似类型/任务的列表推导式的代码片段。理解公式中的每个迭代都是 numpy.array [(),(),()] 形状。是否有更多的“pythonic”,而不是如此重复的编写方式?

conv_zcr = [bytes(x) for x in zcr]
conv_stft = [bytes(x) for x in stft]
conv_spectral_centroid = [bytes(x) for x in spectral_centroid]

解决方法

好吧,如果他们有相同的 len,我想您可以尝试将其压缩在一起:

conv_zcr,conv_stft,conv_spectral_centroid = [
    (bytes(x),bytes(y),bytes(z))
    for x,y,z in zip(zcr,stft,spectral_centroid)
]

如果混合输出不是问题,您可能可以chain

out = [bytes(x) for x in itertools.chain(zcr,spectral_centroid)]

您可能可以将它们映射到您喜欢的位置:

out = [map(bytes,ar) for ar in [zcr,spectral_centroid]]
,

我想你可以使用 map(...)。但我不认为它特别像 Pythonic。

conv_zcr = map(bytes,zcr)
conv_stft = map(bytes,stft)
conv_spectral_centroid = map(bytes,spectral_centroid)

如果您不想要延迟加载地图对象,请像这样 list() 投射到 list(map(bytes,zcr))

,

你可以这样做


def byteify_lists(*lists):
    return [[bytest(x) for x in lst] for lst in lists]

conv_zcr,conv_spectral_centroid = byteifly_lists(zcr,spectral_centroid)

或者在单个列表理解中


conv_zcr,conv_spectral_centroid = [[bytes(x) for x in lst] 
                                                for lst in 
                                                [zcr,spetral_centroid]]

但老实说,你拥有它的方式很好。

,

不清楚您希望从三个列表中选择哪个方向。但是,一般来说,如果您希望一组对象经历相同的一组步骤,那么处理该数据的最简单方法通常是将该数据放在一个列表中。例如,

lists = [zcr,spectral_centroid] 

然后,如果我们想将 bytes() 应用于每个列表中的每个条目,我们可以通过多种方式实现:

conv_lists = [[bytes(i) for i in l] for l in lists]
conv_lists = [list(map(bytes,l)) for l in lists]

如果您希望元素以另一种方式定向,那么您可能需要 zip() 函数:

conv_lists = [list(map(bytes,l)) for l in zip(*lists)] 

如果你想把结果放在 np.array() 中,那么把它包装在 np.array() 中:

import numpy as np
conv_lists = np.array([list(map(bytes,l)) for l in zip(*lists)])

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...