结合基于另一个列表的Python列表元素

时间:2014-10-12 01:05:47

标签: python list

我有2个名单:

phon = ["A","R","K","H"]
idx = [1,2,3,3]

idx对应于phon的分组方式。在这种情况下,phon_grouped应为["A","R","KH"],因为"K""H"都对应于第3组。

我假设需要某种zipmap功能,但我不确定如何实现它。我有类似的东西:

a = []
for i in enumerate(phon):
    a[idx[i-1].append(phon[i])

但这实际上不起作用/编译

2 个答案:

答案 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']