繁体   English   中英

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

[英]Is there a more pythonic way to use multiple list comprehension?

有类似类型/任务的列表理解的代码片段。 每个可迭代的理解公式都是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 em:

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

您可以根据自己的喜好对它们进行 map:

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

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

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

如果您不想延迟加载 map object,请像此list(map(bytes, zcr)) ) 一样转换为list()

你可以做


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

conv_zcr, conv_stft, conv_spectral_centroid = byteifly_lists(zcr, stft, spectral_centroid)

或者在单个列表理解中


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

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

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

lists = [zcr, stft, 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() function:

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)])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM