对于两个列表中的每个匹配元素,添加一个列表并扩展

vin*_*ent 1 python

出于某种原因,我的大脑不能正常工作.

我有两个排序的类似列表的对象:

>>> a = [1,2,3,4]

>>> b = [1,1,2,2,2,3,3,3]
Run Code Online (Sandbox Code Playgroud)

从这里,我需要得到:

>>> a = [ [1,[1,1]], [2,[2,2,2]], [3,[3,3,3]], 4]
Run Code Online (Sandbox Code Playgroud)

Codewise,我在想这个......

>>> i = 0
>>> first = True
>>> for num in b:
...    if num == a[i]:
...       if first:
...          a[i] = [a[i],[num]]
...          first = False
...       else:
...          a[i][1].append(num)
...    else:
...       first = True
...       if a[i+1] == num:
...          a[i] = [a[i+1],[num]]
...       else:
...          print 'problem'
Run Code Online (Sandbox Code Playgroud)

但我一直感到困惑.什么是解决这个问题的有效方法?也许,我感觉像是递归,但我也想不出来.

the*_*eye 6

由于数据已经排序,您可以b根据数字进行分组,并使用字典理解创建字典.在下一次通过keys(a)时,您可以从字典中获取与元素对应的元素a并创建新列表.

a, b = [1,2,3,4], [1,1,2,2,2,3,3,3]
from itertools import groupby

d = {k:list(grp) for k, grp in groupby(b)}
# {1: [1, 1], 2: [2, 2, 2], 3: [3, 3, 3]}

print [[k, d[k]] if k in d else k for k in a]
# [[1, [1, 1]], [2, [2, 2, 2]], [3, [3, 3, 3]], 4]
Run Code Online (Sandbox Code Playgroud)