我目前有:
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
答案 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())}