我有2个名单:
phon = ["A","R","K","H"]
idx = [1,2,3,3]
idx
对应于phon
的分组方式。在这种情况下,phon_grouped
应为["A","R","KH"]
,因为"K"
和"H"
都对应于第3组。
我假设需要某种zip
或map
功能,但我不确定如何实现它。我有类似的东西:
a = []
for i in enumerate(phon):
a[idx[i-1].append(phon[i])
但这实际上不起作用/编译
答案 0 :(得分:2)
在压缩后使用zip()
和itertools.groupby()
对输出进行分组:
from itertools import groupby
from operator import itemgetter
result = [''.join([c for i, c in group])
for key, group in groupby(zip(idx, phon), itemgetter(0))]
itertools.groupby()
要求您的输入已经按键排序(此处为idx
值)。
zip()
将来自idx
的索引与phon
itertools.groupby()
将结果元组分组到第一个值索引上。等索引值将元组置于同一组演示:
>>> from itertools import groupby
>>> from operator import itemgetter
>>> phon = ["A","R","K","H"]
>>> idx = [1,2,3,3]
>>> [''.join([c for i, c in group]) for key, group in groupby(zip(idx, phon), itemgetter(0))]
['A', 'R', 'KH']
答案 1 :(得分:2)
如果您不想使用额外的课程:
phon = ["A","R","K","H"]
idx = [1,2,3,3]
a = [[] for i in range(idx[-1])] # Create list of lists of length(max(idx))
for data,place in enumerate(idx):
a[place-1].append(phon[data])
[['A'],['R'],['K','H']]
主要的诀窍是预先初始化您的列表。您知道最终列表将是idx中找到的最大数量,这应该是您说idx排序的最后一个数字。
不确定您是希望最终结果是附加列表还是连接字符,即“KH”vs ['K','H']