如何生成不同频率的重复项列表?

How to generate a list of to repetitive items with different frequency?

我想生成如下所示的字符串列表:

['EEG', 'EEG', 'EEG', 'EMG', 'EMG', 'EOG']

但是,例如,有 32 个 'EEG' 项和 2 个 'EMG' 和一个 'EOG'。 我怎么能在一行中做到这一点?

我已经阅读了 Whosebug post 并且我知道可以使用以下代码生成单个重复元素:

['EEG']*32

['EEG' for _ in range(32)]

但我想要一个包含所有具有不同频率的项目的综合列表。 我想要不同项目的平面列表,而不是列表的嵌套列表。

使用乘法运算符然后连接,如下所示:

['EEG']*32 + ['EMG']*2 + ['EOG']

您可以使用乘法运算符重复列表元素,然后将列表相加

answer = ['EEG']*32 + ['EMG']*2 + ['EOG']  
# ['EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EMG', 'EMG', 'EOG']

您可以使用collections.Counter.elements方法:

from collections import Counter
list(Counter(EEG=32, EMG=2, EOG=1).elements())

这个returns:

['EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EEG', 'EMG', 'EMG', 'EOG']

执行此操作的动态方法是:

config = [{"str":"EEG","freq":32},{"str":"EMG","freq":2},{"str":"EOG","freq":1}]
[item for sublist in ([[x["str"]]*x["freq"] for x in config]) for item in sublist]

分解:

config 是一个对象数组,其中 str 键是字符串,freq 键是您要重复的次数

([[x["str"]]*x["freq"] for x in config]) returns 重复字符串数组

外部将这个复杂的数组扁平化为一个简单的列表

您可以使用乘法运算符,然后像这样连接每个列表:

list = ['EEG'] * 32 + ['EMG'] * 2 + ['EOG']

或者您也可以从集合中导入 Counter,就像另一个用户所说的那样:

from collections import Counter
list(Counter(EEG=32, EMG=2, EOG=1).elements())

这两个都会产生一个包含 32 'EEG'、2 'EMG' 和 1 'EOG'

的列表