如果我有一个 x 连续整数列表(每个连续整数至少出现一次)
x = [0, 0, 1, 3, 2, 1, 1, 4, 4]
表示另一个列表的组成员,y
y = [0, 0, 100, 30, 2000, 100, 1000, 40, 4]
提取所有分组列表的最简洁方法是什么,z? (注意:z 中每个子列表的顺序无关紧要。)
z == [[0,0], [100, 100, 1000], [2000], [30], [40, 4]]
我有一种直觉,我可以在一行中完成,但我想不通。
请您参考如下方法:
您可以创建一个列表字典(使用 defaultdict 实现),然后用相应的值更新每个索引位置。这是使用 zip 对结果进行配对完成的。
from collections import defaultdict
dd = defaultdict(list)
for key, val in zip(x, y):
dd[key].append(val)
>>> dd.values()
[[0, 0], [100, 100, 1000], [2000], [30], [40, 4]]
为了保证输出匹配键的排序顺序:
>>> [dd[key] for key in sorted(dd.keys())]
[[0, 0], [100, 100, 1000], [2000], [30], [40, 4]]
时间
x = x * 10000
y = y * 10000
%%timeit
od = OrderedDict()
for k,v in zip(x, y):
od.setdefault(k, []).append(v)
10 loops, best of 3: 49.7 ms per loop
%%timeit
dd = defaultdict(list)
for key, val in zip(x, y):
dd[key].append(val)
100 loops, best of 3: 17.1 ms per loop
