【问题标题】:grouping items in a list of lists containing tuples python在包含元组python的列表列表中对项目进行分组
【发布时间】:2017-05-24 21:06:03
【问题描述】:

我已经很久没有做 python 了,我很困惑这个问题。我有一个列表,其中包含可能其他列表,每个列表都包含不同数量的元组。我尝试使用以前回答的问题,例如grouping python lists of listssorting and grouping nested lists 和其他方法,例如使用计数器,但它们似乎都不适用于我的列表,其输出看起来像这样(这是我的输入数据) :

[('T0931', 'AB', '0.7826705747628963')] [('T0932', 'AB', '0.63950861050628')] [('T0933', 'AB', '0.8960345460457968'), ('T0933', 'AF', '0.8951297220212914'), ('T0933', 'BC', '0.8951297782393018'), ('T0933', 'CD', '0.8951298105762795'), ('T0933', 'DE', '0.8951299080330034'), ('T0933', 'EF', '0.8941510860547524')] [('T0932', 'AB', '0.63950861050628')] [('T0933', 'AB', '0.8960345460457968'), ('T0933', 'AF', '0.8951297220212914'), ('T0933', 'BC', '0.8951297782393018'), ('T0933', 'CD', '0.8951298105762795'), ('T0933', 'DE', '0.8951299080330034'), ('T0933', 'EF', '0.8941510860547524')]

我认为我的列表(元组列表)的格式与其他问题中使用的格式不同。当我询问它的数据类型时,它会出现列表、元组、字符串,但会多次打印这些答案:

print(type(Data))
# Returns list
print(type(Data[0]))
# Returns tuple
print(type(Data[0][0]))
# Returns str

#output looks like this:
<class 'list'>
<class 'list'>
<class 'list'>
<class 'list'>
<class 'list'>

即使我尝试使用 sorted(第二次尝试)对该列表进行排序,它们都返回由许多空列表分隔的同一未分组列表的变体:

# Q is name of list
#attempt 1:    
def grouper(sequence):
            result = []  

            for item in sequence:
                    for members, group in result:
                            if members.intersection(item):  
                                    members.update(item)
                                    group.append(item)
                                    break
                    else:  
                            result.append((set(item), [item]))
            return [group for members, group in result]
    output=grouper(Q)
    print(output)

#attempt 2:
import itertools
    import operator
    Q=sorted(q,key=operator.itemgetter(0))
    for key,group in itertools.groupby(Q,operator.itemgetter(0)):
            print(list(group))

#attempt 3:
from collections import Counter
    C = Counter(Q)
    for list,v in C.items():
            print ([list,]*v)

我想首先按位置 0 的 TXXXX 编号对该列表进行分组,然后按位置 1 的两个字母对列表进行分组,同时保留每个组中的所有重复元素。但是,详细说明如何对 Txxxx 号码进行分组会很有帮助,这样我就可以自己弄清楚如何对位置 1 处的字母做同样的事情。所需的输出应如下所示:

[[('T0931', 'AB', '0.7826705747628963')],[('T0932', 'AB', '0.6395086105062'),('T0932', 'AB', '0.63950861050628')],[('T0933', 'AB', '0.8960345460457968'), ('T0933', 'AF', '0.8951297220212914'), ('T0933', 'BC', '0.8951297782393018'), ('T0933', 'CD', '0.8951298105762795'), ('T0933', 'DE', '0.8951299080330034'), ('T0933', 'EF', '0.8941510860547524'), ('T0933', 'AB', '0.8960345460457968'), ('T0933', 'AF', '0.8951297220212914'), ('T0933', 'BC', '0.8951297782393018'), ('T0933', 'CD', '0.8951298105762795'), ('T0933', 'DE', '0.8951299080330034'), ('T0933', 'EF', '0.8941510860547524')]]

同样在这种情况下,我不相信制作字典会起作用(我在类似问题中看到过),因为这只是列表的一个示例,完整列表在位置 0 处包含许多不同的 Txxxx 数字。

提前谢谢你。

【问题讨论】:

  • 根据您提供的内容,我不认为您的数据是列表列表。您能否提供预期的输入和期望的输出?无法直观地看到您想要的东西,这有点令人困惑。
  • 我已对其进行了编辑以使其更清晰,包括数据类型的新输出,该数据类型的另一部分代码的输出混合在一起导致空列表出现在原始输出中。

标签: python sorting


【解决方案1】:

您可以使用defaultdict 保留每个 tx/code 组合的所有值

from collections import defaultdict

d = defaultdict(list)
for group in q:
   for tx, code, value in group:
        d[tx, code].append(value)

【讨论】:

  • 不幸的是这种方法导致错误:too many values to unpack (expected 3)
  • @Emma Try, for tx, code, *value in group: d[tx, code].append(value)。只需将 * 添加到 value 以允许任意数量的以下项目进入一个变量。仅当您的元组包含 3 个以上的项目时,才会出现这种情况。
【解决方案2】:

你可以使用 group by,就像这样:

my_list=[('T0931', 'AB', '0.7826705747628963'),('T0932', 'AB', '0.63950861050628'),
('T0933', 'AB', '0.8960345460457968'), ('T0933', 'AF', '0.8951297220212914'), 
('T0933', 'BC', '0.8951297782393018'), ('T0933', 'CD', '0.8951298105762795'), 
('T0933', 'DE', '0.8951299080330034'), ('T0933', 'EF', '0.8941510860547524'),
('T0932', 'AB', '0.63950861050628'),('T0933', 'AB', '0.8960345460457968'), 
('T0933', 'AF', '0.8951297220212914'), ('T0933', 'BC', '0.8951297782393018'), 
('T0933', 'CD', '0.8951298105762795'), ('T0933', 'DE', '0.8951299080330034'), 
('T0933', 'EF', '0.8941510860547524')]
import itertools

res =[]
for key, value in itertools.groupby(my_list, lambda x: x[0]):
    l=[]
    for val in value :
        l.append(val)
    res.append(l)

输出:

[[('T0931', 'AB', '0.7826705747628963')], [('T0932', 'AB', '0.63950861050628')], [('T0933', 'AB', '0.8960345460457968'), ('T0933', 'AF', '0.8951297220212914'), ('T0933', 'BC', '0.8951297782393018'), ('T0933', 'CD', '0.8951298105762795'), ('T0933', 'DE', '0.8951299080330034'), ('T0933', 'EF', '0.8941510860547524')], [('T0932', 'AB', '0.63950861050628')], [('T0933', 'AB', '0.8960345460457968'), ('T0933', 'AF', '0.8951297220212914'), ('T0933', 'BC', '0.8951297782393018'), ('T0933', 'CD', '0.8951298105762795'), ('T0933', 'DE', '0.8951299080330034'), ('T0933', 'EF', '0.8941510860547524')]]

【讨论】:

  • @KHELILI Hamza 有没有办法让输出看起来更像[[('T0931', 'AB', '0.7826705747628963')],[('T0932', 'AB', '0.6395086105062'),('T0932', 'AB', '0.63950861050628')],[('T0933', 'AB', '0.8960345460457968'), ('T0933', 'AF', '0.8951297220212914'), ('T0933', 'BC', '0.8951297782393018'), ('T0933', 'CD', '0.8951298105762795'), ('T0933', 'DE', '0.8951299080330034'), ('T0933', 'EF', '0.8941510860547524'), ('T0933', 'AB', '0.8960345460457968' ...)]],这样每个 Txxxx 数字都有自己的列表,其中包含该列表中包含该 Txxxx 数字的元组的所有实例?
猜你喜欢
  • 1970-01-01
  • 2010-10-29
  • 2016-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多