对每个子列表中的某些值进行分组的列表

2024-10-05 11:24:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一本包含列表的词典。例如

{1: [[sender11, receiver11, text11, address11]], 
 2: [[sender21, receiver21, text21, address21], [sender22, receiver22, text22, address22]], 
 3: [[sender31, receiver31, text31, address31], [sender32, receiver32, text32, address32], [sender33, receiver33, text33, address33]]
 4: [[sender41, receiver41, text41, address41], [sender42, receiver42, text42, address42], [sender43, receiver43, text43, address43], [sender44, receiver44, text44, address44]]}

我想做的是,对于包含2个或更多元素的列表的dictionary元素(即本例中的dict[2]dict[3]dict[4]),我对每个列表值的sender, receiver, text进行比较。对于具有相同sender, receiver, text的每组列表值,我将做一些事情。你知道吗

例如,在dict[3]中,如果sender31, receiver31, text31sender32, receiver32, text32sender33, receiver33, text33的值相同,那么我将对所有3个列表值进行处理。你知道吗

假设在dict[4]中,如果sender41, receiver41, text41sender42, receiver42, text42的值相同,而sender43, receiver43, text43sender44, receiver44, text44的值相同,但与sender41, receiver41, text41不同,那么我将分别处理这两个组。你知道吗

我编写了一个Python脚本,用蛮力比较sender21, receiver21, text21sender22, receiver22, text22的值,即

if sender21 == sender22 and receiver21 == receiver22 and text21 == text22:
   # Do something

这是没有效率的,因为它只适用于2个列表值,但我不知道我应该如何实现这一点,使它适用于任何数量的列表值大于1。你知道吗


Tags: 列表dicttext22text21text31sender21sender22receiver21
1条回答
网友
1楼 · 发布于 2024-10-05 11:24:20

我认为^{}是最明显的方法:

from collections import defaultdict

def collate(seq):
    groups = defaultdict(list)
    for subseq in seq:
        groups[tuple(subseq[:3])].append(subseq[3])
    return groups

根据您的实际数据,您可以将上面函数中的tuple(subseq[:3])替换为例如(subseq[1], subseq[4], subseq[5]),或者将附加的subseq[3]替换为subseq。。。这取决于你对数据的处理。你知道吗

但是,键必须是元组而不是列表,因为键必须是不可变的。你知道吗

示例:

>>> data = [
...     ['S1', 'R1', 'T1', 'A3'],
...     ['S2', 'R2', 'T2', 'A4'],
...     ['S1', 'R1', 'T1', 'A5'],
...     ['S2', 'R2', 'T2', 'A6']
... ]

>>> collate(data)
defaultdict(<type 'list'>, {
    ('S2', 'R2', 'T2'): ['A4', 'A6'],
    ('S1', 'R1', 'T1'): ['A3', 'A5']
})

你可以像处理其他字典一样处理这个问题

>>> for (sender, receiver, text), addresses in collate(data).items():
...     print sender, receiver, text
...     print '|'.join(addresses)
...     print
... 
S2 R2 T2
A4|A6

S1 R1 T1
A3|A5
 

相关问题 更多 >

    热门问题