簡體   English   中英

過濾python中的元組列表

[英]filtering a list of tuples in python

我正在尋找一種干凈的pythonic方法來執行以下操作

我有一個元組列表說:

[(1,'a'), (1,'b'), (1,'c'), (2, 'd'), (5, 'e'), (5, 'f')]

我想創建一個新列表,該列表將丟棄之前已經看到過第一個鍵的元組。 因此,上述的o / p為:

[(1,'c'), (2,'d'), (5, 'f')]

謝謝!

一種簡單的方法是創建一個字典,因為它將只保留最后一個具有相同鍵的元素:

In [1]: l = [(1,'a'), (1,'b'), (1,'c'), (2, 'd'), (5, 'e'), (5, 'f')]

In [2]: dict(l).items()
Out[2]: [(1, 'c'), (2, 'd'), (5, 'f')]

更新:正如@Tadeck在其評論中提到的那樣,由於不能保證字典項目的順序,因此您可能要使用有序字典

from collections import OrderedDict
newl = OrderedDict(l).items()

如果您實際上想使用相同的鍵來保留第一個元組(而不是最后一個,則您的問題是模棱兩可的),則可以首先反轉列表,將其添加到字典中,然后再次反轉.items()的輸出。
盡管在這種情況下,可能有更好的方法可以完成此操作。

使用unique_everseenitertools 文檔

from itertools import ifilterfalse
def unique_everseen(iterable, key=None):
    "List unique elements, preserving order. Remember all elements ever seen."
    # unique_everseen('AAAABBBCCDAABBB') --> A B C D
    # unique_everseen('ABBCcAD', str.lower) --> A B C D
    seen = set()
    seen_add = seen.add
    if key is None:
        for element in ifilterfalse(seen.__contains__, iterable):
            seen_add(element)
            yield element
    else:
        for element in iterable:
            k = key(element)
            if k not in seen:
                seen_add(k)
                yield element

a = [(1,'a'), (1,'b'), (1,'c'), (2, 'd'), (5, 'e'), (5, 'f')]

print list(unique_everseen(a,key=lambda x: x[0]))

屈服

[(1, 'a'), (2, 'd'), (5, 'e')]

一位班輪專科醫生的巧妙技巧,可以使順序保持正確(我承認它不是很可讀,但是您知道...)

>>> s = [(1,'a'), (1,'b'), (1,'c'), (2, 'd'), (5, 'e'), (5, 'f')]
>>> seen = set()
>>> [seen.add(x[0]) or x for x in s if x[0] not in seen]
[(1, 'a'), (2, 'd'), (5, 'e')]

暫無
暫無

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

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