在Python中对包含元组的列表的项目进行分组

3

我对Python并不是很熟悉,目前卡在了这个问题上。我有一个列表,其中包含许多其他列表,每个列表都包含数量不同的元组。我尝试使用之前回答过的问题,例如将Python中的列表分组排序和分组嵌套列表以及使用计数器等其他方法,但它们似乎都无法处理我的列表,其输出结果看起来像这样(这是我的输入数据):

[('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编号。

提前感谢您。


根据您提供的内容,我不认为您的数据是一个列表嵌套列表。您能否提供期望的输入和输出呢?如果无法直观地看到您想要的内容,这会有些令人困惑。 - Steven Summers
我已经编辑过它,试图使其更清晰,包括来自另一部分代码输出的数据类型的新输出,导致原始输出中出现了空列表。 - Emma
2个回答

0

你可以使用 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
1
@Emma 尝试一下这段代码:for tx, code, *value in group: d[tx, code].append(value)。只需要在 value 变量前面加上一个 *,就可以允许任意数量的后续项并入到同一个变量中。但是,仅当你的元组包含超过 3 个项目时才应使用此方法。 - Steven Summers

0
你可以像这样使用 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 号码的元组的所有实例? - Emma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接