我想要将元组值添加到元组中,如果元组[0:2]与下方所示重复:

2024-04-27 11:55:06 发布

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

这是我的名单

some_list = [('A','B','IP1','N1'),('A','B','IP3','N3'),('B','C','IP2','N2'),('B','C','IP3','N3'),('D','F','IP4','N4')]

假设'A','B'('A','B','IP1','N1'),('A','B','IP3','N3') 然后我们需要将这两个元组组合在一起,并将('A','B','IP1','N1'),('A','B','IP3','N3')替换为some_list中的('A','B','IP1','N1','IP3','N3')

结果:

some_list = [('A','B','IP1','N1','IP3','N3'), ('B','C','IP2','N2','IP3','N3'), ]

应该来,但要确保不是“A”、“B”、“C”,。。不管怎样,每次都不一样

你能帮我吗?你知道吗


Tags: somelist名单n2ip2n3ip4n1
3条回答

基本上你需要为你的2个值创建一个元组键,并用它创建一个默认字典。你知道吗

为每个键扩展列表的其余部分,并通过向值中添加键(as list)将键/值耦合转换回列表列表

像这样:

import collections

some_list = [('A','B','IP1','N1'),('A','B','IP3','N3'),('B','C','IP2','N2'),('B','C','IP3','N3'),('D','F','IP4','N4')]

c = collections.defaultdict(list)
for k1,k2,*b in some_list:   # extended iterable unpacking allows this
    c[(k1,k2)].extend(b)  # add to existing list or create a new one

result = [a+tuple(b) for a,b in c.items()]

结果:

>>> result
[('D', 'F', 'IP4', 'N4'),
 ('B', 'C', 'IP2', 'N2', 'IP3', 'N3'),
 ('A', 'B', 'IP1', 'N1', 'IP3', 'N3')]

for k1,k2,*b in some_list部分允许将前两个值放在单独的k1k2变量中,并将“rest”放在b列表中。此功能在Python2中不可用。Python 2用户可以用更基本的

for a in some_list:
    c[tuple(a[:2])].extend(a[2:])  # add to existing list or create a new one

(这个问题类似于:Merge tuples with the same key对于核心部分,但是前后处理使它不同)

您还可以使用^{}将元组按前两项分组,然后将元组的其余部分合并到末尾并展开:

from itertools import groupby
from itertools import chain
from pprint import pprint


some_list = [
    ("A", "B", "IP1", "N1"),
    ("A", "B", "IP3", "N3"),
    ("B", "C", "IP2", "N2"),
    ("B", "C", "IP3", "N3"),
    ("D", "F", "IP4", "N4"),
]

# key -> first two, rest -> everything after first two
key, rest = lambda x: x[:2], lambda x: x[2:]

pprint(
    [
        list(chain.from_iterable((k, *tuple(map(rest, g)))))
        for k, g in groupby(sorted(some_list, key=key), key=key)
    ]
)

它给出了以下结果:

[['A', 'B', 'IP1', 'N1', 'IP3', 'N3'],
 ['B', 'C', 'IP2', 'N2', 'IP3', 'N3'],
 ['D', 'F', 'IP4', 'N4']]

上面使用^{}来展平分组的元组。您还需要按前两项对元组列表进行排序,以便使用itertools.groupby()对它们进行分组。这是因为它在iterable中按连续键分组,这只能通过排序来实现。你知道吗

此外,如果元组列表的长度始终为4,并且键始终是前两项,则还可以使用^{}表示keyrest

from operator import itemgetter
key, rest = itemgetter(0, 1), itemgetter(2, 3)

它查找前两个值(0,1)和后两个值(2,3)。你知道吗

你也可以尝试下面的代码。你知道吗

>>> def get_combined_items(tup1, tup2):
...     l = list(tup1)
...     for item in tup2:
...         if item not in l:
...             l.append(item)
...     return l
...
>>>
>>> if len(some_list) % 2 == 0: # even number of items
...     some_list = [tuple(get_combined_items(some_list[i], some_list[i + 1])) for i in range(0, len(some_list) - 1, 2)]
... else:
...     last_item = some_list[-1] # save last item
...     some_list = [tuple(get_combined_items(some_list[i], some_list[i + 1])) for i in range(0, len(some_list) - 1, 2)]
...     some_list = some_list + [last_item]
...
>>> some_list
[('A', 'B', 'IP1', 'N1', 'IP3', 'N3'), ('B', 'C', 'IP2', 'N2', 'IP3', 'N3'), ('D', 'F', 'IP4', 'N4')]
>>>

如果您想尝试第三方软件包,请使用pip install ordered-set安装ordered-set。你知道吗

» pip install ordered-set

您可以检查https://pypi.org/project/ordered-set/。你知道吗

Note: This is just to keep the elements in order after passing the combined tuple to set().

>>> from ordered_set import OrderedSet
>>>
>>> some_list = [('A','B','IP1','N1'),('A','B','IP3','N3'),('B','C','IP2','N2'),('B','C','IP3','N3'),('D','F','IP4','N4')]
>>>
>>> if len(some_list) % 2 == 0: # even number of items
...     some_list = [tuple(OrderedSet(some_list[i] + some_list[i + 1])) for i in range(0, len(some_list) - 1, 2)]
... else:
...     last_item = some_list[-1] # save last item
...     some_list = [tuple(OrderedSet(some_list[i] + some_list[i + 1])) for i in range(0, len(some_list) - 1, 2)]
...     some_list = some_list + [last_item]
...
>>>
>>> some_list
[('A', 'B', 'IP1', 'N1', 'IP3', 'N3'), ('B', 'C', 'IP2', 'N2', 'IP3', 'N3'), ('D', 'F', 'IP4', 'N4')]
>>>

相关问题 更多 >