根据列表B通过分组生成列表A的子列表

时间:2016-01-27 02:42:38

标签: python python-2.7

我目前有:

a = [939, 84, 100, 338, 281, 94, 884, 848]
b = ["red", "green", "orange", 'blue']*2
zip_list = zip(a, b)

返回:

[(939, 'red'), (84, 'green'), (100, 'orange'), (338, 'blue'), (281, 'red'), 
(94, 'green'), (884, 'orange'), (838, 'blue')]

从这里我的目标是获得:

   # blue #   # green # # orange #   # red #
[ [338, 838], [84, 94], [100,884], [939, 281] ]

即,从列表a派生的新列表,按列表b分组(注意字母顺序)。

b中唯一元素的长度始终是a长度的因子(数学意义),例如len(a) == 8& len(unique(b)) == 4

2 个答案:

答案 0 :(得分:2)

以下是我使用itertools.groupby

的尝试
>>> from operator import itemgetter
>>> import itertools
>>> sorted_zip_list = sorted(zip_list, key=itemgetter(1))
>>> sorted_zip_list
[(338, 'blue'), (848, 'blue'), (84, 'green'), (94, 'green'), (100, 'orange'), (884, 'orange'), (939, 'red'), (281, 'red')]
>>> result = []
>>> for _, g in itertools.groupby(sorted_zip_list, itemgetter(1)):
...     result.append([e[0] for e in g])
...
>>> result
[[338, 848], [84, 94], [100, 884], [939, 281]]

我先排序zip_list,因此可以使用groupby。为方便起见导入了itemgetter,可以使用lambda e: e[1]

替换

但一般来说,你应该使用TigerhawkT3的方法代替OrderedDict

答案 1 :(得分:1)

使用defaultdict是我想要的。 您可以在参数中指定defaultdict键的值类型。

from collections import defaultdict

d = defaultdict(list)

表示密钥,val表示压缩:

 d[key].append(val)

排序可以通过以下方式获得:

{k:v for k,v in sorted(d.items())}