在列表python中重新组织列表

在列表python中重新组织列表,python,list,key,Python,List,Key,我需要在列表中重新组织两个列表,并找到每个键值和的总和 list1 = [[a,b,c],[a,b,c],[a,b,c],[a,b,c],[b,c],[b,c],[a,c],[a,c],[b],[b],[d],[d]] list2 = [[3,5,2],[-5,-2,-3],[12,11,8],[-8,-7,-5],[2,3],[-3,-2],[23,21],[-12,-22],[11],[-11],[22],[-21]] 列表1是键的字符串列表,例如d71de5eb-18d9-4e85

我需要在列表中重新组织两个列表,并找到每个键值和的总和

list1 = [[a,b,c],[a,b,c],[a,b,c],[a,b,c],[b,c],[b,c],[a,c],[a,c],[b],[b],[d],[d]] 

list2 = [[3,5,2],[-5,-2,-3],[12,11,8],[-8,-7,-5],[2,3],[-3,-2],[23,21],[-12,-22],[11],[-11],[22],[-21]] 
列表1是键的字符串列表,例如d71de5eb-18d9-4e85-9033-01be046f072e 列表2只是值的整数

新列表列出了我要查找的内容:

list1new = [a,b,c,d]
list2new = [13,6,2,1]

你是平行列表真的没有帮助使这成为一个容易的问题。诀窍是将列表展平,并将其压缩到一个字典中,该字典将字符串映射到一个值列表。itertools和collections可以提供帮助

>>> a, b, c, d = 'abcd'                                                         >>> list1 = [[a,b,c],[a,b,c],[a,b,c],[a,b,c],[b,c],[b,c],[a,c],[a,c],[b],[b],[d],[d]] 
>>> list2 = [[3,5,2],[-5,-2,-3],[12,11,8],[-8,-7,-5],[2,3],[-3,-2],[23,21],[-12,-22],[11],[-11],[22],[-21]] 
>>> import collections
>>> import itertools
>>> elems1 = itertools.chain.from_iterable(list1)
>>> elems2 = itertools.chain.from_iterable(list2)
>>> d = collections.defaultdict(list)
>>> for key, value in zip(elems1, elems2):
...     d[key].append(value)
... 
>>> for k, lst in d.items():
...   print k, sum(lst)
... 
a 13
c 2
b 6
d 1
您可以使用itertools.groupby和itertools.chain:

或者作为更具Python风格的方式,您可以使用collections.defaultdict:

演示:

首先,您可以压缩列表以获得以下内容:

>>> zip(list1,list2)

[(['a', 'b', 'c'], [3, 5, 2]), (['a', 'b', 'c'], [-5, -2, -3]), (['a', 'b', 'c'], [12, 11, 8]), (['a', 'b', 'c'], [-8, -7, -5]), (['b', 'c'], [2, 3]), (['b', 'c'], [-3, -2]), (['a', 'c'], [23, 21]), (['a', 'c'], [-12, -22]), (['b'], [11]), (['b'], [-11]), (['d'], [22]), (['d'], [-21])]
现在需要将所有元组压缩在一起,这样就可以使用s=[zip*i for i in ziplist1,list2]:

然后您需要将所有内部列表链接起来进行排序和分组,因此您可以使用itertool.chain:

现在,根据元组的第一个元素对上面的列表进行分组,您可以得到以下grub:

>>> [list(g) for _,g in groupby(t,lambda x : x[0])]
[[('a', -12), ('a', -8), ('a', -5), ('a', 3), ('a', 12), ('a', 23)], [('b', -11), ('b', -7), ('b', -3), ('b', -2), ('b', 2), ('b', 5), ('b', 11), ('b', 11)], [('c', -22), ('c', -5), ('c', -3), ('c', -2), ('c', 2), ('c', 3), ('c', 8), ('c', 21)], [('d', -21), ('d', 22)]]
然后可以压缩前面结果的嵌套列表:

>>> a=[zip(*i) for i in [list(g) for _,g in groupby(t,lambda x : x[0])]]
[[('a', 'a', 'a', 'a', 'a', 'a'), (-12, -8, -5, 3, 12, 23)], [('b', 'b', 'b', 'b', 'b', 'b', 'b', 'b'), (-11, -7, -3, -2, 2, 5, 11, 11)], [('c', 'c', 'c', 'c', 'c', 'c', 'c', 'c'), (-22, -5, -3, -2, 2, 3, 8, 21)], [('d', 'd'), (-21, 22)]]
最后你需要的是ziped元素的第一个索引和第二个元素的和:

>>> [(set(i),sum(j)) for i,j in a]
[(set(['a']), 13), (set(['b']), 6), (set(['c']), 2), (set(['d']), 1)]

使用pop获取集合的元素。

list2元素是list2元素与list1元素对应的值之和吗?正确。list2new是与list1元素对应的list2值之和。@kojiro-Oops。这套代码能让你享受多重分配的乐趣。但是是的,这是一个复制/粘贴错误。谢谢你的回答!但是你的方法给出:Runtime error ArgumentTypeException:str不可调用:此代码:[listg For ug,g in groupbyt,lambda x:x[0]]@ThomasPerkov不客气你运行了我写的第一部分了吗?@ThomasPerkov我最小化了答案顶层的代码,你需要使用它,这很好,
>>> t=sorted(chain(*s))
>>> t
[('a', -12), ('a', -8), ('a', -5), ('a', 3), ('a', 12), ('a', 23), ('b', -11), ('b', -7), ('b', -3), ('b', -2), ('b', 2), ('b', 5), ('b', 11), ('b', 11), ('c', -22), ('c', -5), ('c', -3), ('c', -2), ('c', 2), ('c', 3), ('c', 8), ('c', 21), ('d', -21), ('d', 22)]
>>> [list(g) for _,g in groupby(t,lambda x : x[0])]
[[('a', -12), ('a', -8), ('a', -5), ('a', 3), ('a', 12), ('a', 23)], [('b', -11), ('b', -7), ('b', -3), ('b', -2), ('b', 2), ('b', 5), ('b', 11), ('b', 11)], [('c', -22), ('c', -5), ('c', -3), ('c', -2), ('c', 2), ('c', 3), ('c', 8), ('c', 21)], [('d', -21), ('d', 22)]]
>>> a=[zip(*i) for i in [list(g) for _,g in groupby(t,lambda x : x[0])]]
[[('a', 'a', 'a', 'a', 'a', 'a'), (-12, -8, -5, 3, 12, 23)], [('b', 'b', 'b', 'b', 'b', 'b', 'b', 'b'), (-11, -7, -3, -2, 2, 5, 11, 11)], [('c', 'c', 'c', 'c', 'c', 'c', 'c', 'c'), (-22, -5, -3, -2, 2, 3, 8, 21)], [('d', 'd'), (-21, 22)]]
>>> [(set(i),sum(j)) for i,j in a]
[(set(['a']), 13), (set(['b']), 6), (set(['c']), 2), (set(['d']), 1)]