如何对元组列表进行分组? [英] How to group list of tuples?

查看:130
本文介绍了如何对元组列表进行分组?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

注意:我当然知道如何在显式的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆