Skip to main content
 首页 » 编程设计

python之按成员在另一个列表中的顺序对列表元素进行分组

2025年05月04日25yyy_WW

如果我有一个 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