多个元组的列表,如何在小元组中提取相同的前两个元素在大元组中

2024-05-28 19:58:05 发布

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

我有一个元组列表,如下所示:

x = [
    (('102', '393', 'abc'), 63),
    (('102', '393', 'ack'), 8),
    (('117', '393', 'bcx'), 57),
    (('390', '393', 'wff'), 41),
    (('393', '102', 'wer'), 40),
    (('393', '102', 'wfv'), 78),
    (('393', '117', 'iyy'), 7),
    (('393', '448', 'wec'), 25),
]

我正在尝试提取元组,其中“('102','393','abc'),63)和“('102','393','ack'),8)”在同一个小列表中

所以输出应该是

[
  [ (('102', '393', 'abc'), 63), (('102', '393', 'ack'), 8)],
  [ (('117', '393', 'bcx'), 57)],
  [ (('390', '393', 'wff'), 41)],
  [ (('393', '102', 'wer'), 40), (('393', '102', 'wfv'), 78)],
  [ (('393', '117', 'iyy'), 7)],
  [ (('393', '448', 'wec'), 25)]
]

我正在尝试用python和bubble\u sort执行它。我试过了

for i in range(1, len(x)):
    for j in range(0, len(x)):
        if x[j][0] == x[j + 1][0] and x[j][1] == x[j + 1][1]:
            pass

但是,它不起作用

在此方面的任何帮助都将不胜感激


Tags: in列表forlenrange元组abcbubble
2条回答

使用itertools.groupbydoc):

x = [
    (('102', '393', 'abc'), 63),
    (('102', '393', 'ack'), 8),
    (('117', '393', 'bcx'), 57),
    (('390', '393', 'wff'), 41),
    (('393', '102', 'wer'), 40),
    (('393', '102', 'wfv'), 78),
    (('393', '117', 'iyy'), 7),
    (('393', '448', 'wec'), 25),
]

from itertools import groupby

out = [[*g] for _, g in groupby(x, lambda k: (k[0][0], k[0][1]))]

from pprint import pprint
pprint(out)

印刷品:

[[(('102', '393', 'abc'), 63), (('102', '393', 'ack'), 8)],
 [(('117', '393', 'bcx'), 57)],
 [(('390', '393', 'wff'), 41)],
 [(('393', '102', 'wer'), 40), (('393', '102', 'wfv'), 78)],
 [(('393', '117', 'iyy'), 7)],
 [(('393', '448', 'wec'), 25)]]

您可以尝试使用defaultdict/dict:

from pprint import pprint
from collections import defaultdict

x = [
    (('102', '393', 'abc'), 63),
    (('102', '393', 'ack'), 8),
    (('117', '393', 'bcx'), 57),
    (('390', '393', 'wff'), 41),
    (('393', '102', 'wer'), 40),
    (('393', '102', 'wfv'), 78),
    (('393', '117', 'iyy'), 7),
    (('393', '448', 'wec'), 25),
]

val = defaultdict(list)

for item in x: 
    val[item[0][0], item[0][1]].append(item)

pprint(list(val.values()))

输出:

[[(('102', '393', 'abc'), 63), (('102', '393', 'ack'), 8)],
 [(('117', '393', 'bcx'), 57)],
 [(('390', '393', 'wff'), 41)],
 [(('393', '102', 'wer'), 40), (('393', '102', 'wfv'), 78)],
 [(('393', '117', 'iyy'), 7)],
 [(('393', '448', 'wec'), 25)]]

如果要仅从每个列表项中获取第二个元素,请在进行上述处理之后:

pprint([[e[1] for e in i] for i in val.values()])

输出:

[[63, 8], [57], [41], [40, 78], [7], [25]]

相关问题 更多 >

    热门问题