如何生成不同频率的重复项列表?
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'
的列表
我想生成如下所示的字符串列表:
['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'
的列表