如何对元组列表进行分组? [英] How to group list of tuples?
问题描述
注意:我当然知道如何在显式的for循环中做到这一点,但我正在寻找一种更具可读性的解决方案。
如果可能的话,我想通过使用一些内置功能来解决这个问题。最好的情况是类似
结果= [* groupby逻辑*]
假设以下列表:
导入numpy为np
np.random.seed(42)
N = 10
my_tuples = list(zip(np。 random.choice(list('ABC'),size = N),
np.random.choice(range(100),size = N)))
其中 my_tuples
是
[('C',74),
('A',74),
('C',87),
('C',99) ,
('A',23),
('A',2),
('C',21),
('B',52),
('C',1),
('C',87)]
如何使用itertools中的 groupby
通过标签A,B和C对索引(每个元组的索引1的整数值)进行分组?
如果我做这样的事情:
来自itertools import groupby
#..
[(k,* v)for dict中的k,v(groupby(my_tuples,la mbda x:x [0]))。items()]
我看到这提供了错误的信息结果。
期望的结果应该是
{
'A':[74,23,2],
#..
}
对于O( n )解决方案,应使用 collections.defaultdict
,请参见< a href = https://stackoverflow.com/a/50624452/9209546> @PatrickHaugh的答案。
使用 itertools .groupby
需要在分组之前进行排序,从而导致O( n log n )复杂度:
<来自itertools导入组的pre>
来自操作员导入项的
来自操作员导入项的获取
sorter = sorted(my_tuples,key = itemmetter(0))
grouper = groupby(sorter,key = itemgetter(0))
res = {k:grouper中k,v的list(map(itemgetter(1),v))}
打印(res)
{'A':[74,23,2],
'B':[52],
'C':[74,87 ,99,21,1,87]}
Note: I know how I can do this of course in an explicit for loop but I am looking for a solution that is a bit more readable.
If possible, I'd like to solve this by using some of the built-in functionalities. Best case scenario is something like
result = [ *groupby logic* ]
Assuming the following list:
import numpy as np
np.random.seed(42)
N = 10
my_tuples = list(zip(np.random.choice(list('ABC'), size=N),
np.random.choice(range(100), size=N)))
where my_tuples
is
[('C', 74),
('A', 74),
('C', 87),
('C', 99),
('A', 23),
('A', 2),
('C', 21),
('B', 52),
('C', 1),
('C', 87)]
How can I group the indices (integer value at index 1 of each tuple) by the labels A, B and C using groupby
from itertools?
If I do something like this:
from itertools import groupby
#..
[(k,*v) for k, v in dict(groupby(my_tuples, lambda x: x[0])).items()]
I see that this delivers the wrong result.
The desired outcome should be
{
'A': [74, 23, 2],
# ..
}
You should use collections.defaultdict
for an O(n) solution, see @PatrickHaugh's answer.
Using itertools.groupby
requires sorting before grouping, incurring O(n log n) complexity:
from itertools import groupby
from operator import itemgetter
sorter = sorted(my_tuples, key=itemgetter(0))
grouper = groupby(sorter, key=itemgetter(0))
res = {k: list(map(itemgetter(1), v)) for k, v in grouper}
print(res)
{'A': [74, 23, 2],
'B': [52],
'C': [74, 87, 99, 21, 1, 87]}
这篇关于如何对元组列表进行分组?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!