簡體   English   中英

Python 元組列表將第二個元素與唯一的第一個元素合並

[英]Python list of tuples merge 2nd element with unique first element

給定一個像這樣的元組列表:

a = [ ( "x", 1, ), ( "x", 2, ), ( "y", 1, ), ( "y", 3, ), ( "y", 4, ) ]

過濾唯一的第一個元素並合並第二個元素的最簡單方法是什么。 需要這樣的輸出。

b = [ ( "x", 1, 2 ), ( "y", 1, 3, 4 ) ]

謝謝,

>>> a = [("x", 1,), ("x", 2,), ("y", 1,), ("y", 3,), ("y", 4,)]
>>> d = {}
>>> for k, v in a:
...     d.setdefault(k, [k]).append(v)
>>> b = map(tuple, d.values())
>>> b
[('y', 1, 3, 4), ('x', 1, 2)]

您可以使用defaultdict

>>> from collections import defaultdict
>>> d = defaultdict(tuple)
>>> a = [('x', 1), ('x', 2), ('y', 1), ('y', 3), ('y', 4)]
>>> for tup in a:
...     d[tup[0]] += (tup[1],)
...
>>> [tuple(x for y in i for x in y) for i in d.items()]
[('y', 1, 3, 4), ('x', 1, 2)]

這就是我想出的:

[tuple(list(el) + [q[1] for q in a if q[0]==el]) for el in set([q[0] for q in a])]

除了前面的答案,另一個單行:

>>> a = [ ( "x", 1, ), ( "x", 2, ), ( "y", 1, ), ( "y", 3, ), ( "y", 4, ) ]
>>> from itertools import groupby
>>> [(key,) + tuple(elem for _, elem in group) for key, group in groupby(a, lambda pair: pair[0])]
[('x', 1, 2), ('y', 1, 3, 4)]

一種方法是將列表理解表達式與itertools.groupbyitertools.chainoperator.itemgetter一起使用,如下所示:

>>> from itertools import groupby, chain
>>> from operator import itemgetter

>>> my_list = [ ( "x", 1, ), ( "x", 2, ), ( "y", 1, ), ( "y", 3, ), ( "y", 4, ) ]

>>> [set(chain(*i)) for _, i in groupby(sorted(my_list), key=itemgetter(0))]
[set(['x', 2, 1]), set(['y', 1, 3, 4])]

注意: set本質上是無序的,因此它們不會保留元素的位置。 如果位置很重要,請不要使用set

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM