3 回答

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超8個(gè)贊
通常的方法是從你想要重復(fù)數(shù)據(jù)刪除的任何內(nèi)容中鍵入一個(gè)字典,例如:
>>> a = [(0, 13, 'order1'), (14, 27, 'order2'), (14, 27, 'order2.1'), (0, 13, 'order1'), (28, 41, 'order3')]
>>> print(*{tup[:2]: tup for tup in a}.values())
(0, 13, 'order1') (14, 27, 'order2.1') (28, 41, 'order3')
這是O(n)時(shí)間復(fù)雜度,優(yōu)于基于O(n log n) groupby 的方法。

TA貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超8個(gè)贊
您可以在分組的排序列表中獲取每個(gè)組的第一個(gè)元素:
from itertools import groupby
from operator import itemgetter
a = [(0, 13, 'order1'), (14, 27, 'order2'), (14, 27, 'order2.1'), (0, 13, 'order1'), (28, 41, 'order3')]
result = [list(g)[0] for k, g in groupby(sorted(a), key=itemgetter(0))]
print(result)

TA貢獻(xiàn)1868條經(jīng)驗(yàn) 獲得超4個(gè)贊
您應(yīng)該避免在迭代列表時(shí)就地修改列表。相反,您可以使用流行的itertools unique_everseen食譜,也可以在 3rd party 中使用more_itertools。只需operator.itemgetter在key參數(shù)中使用:
from more_itertools import unique_everseen
from operator import itemgetter
res = list(unique_everseen(L, key=itemgetter(0, 1)))
該解決方案需要O(?)時(shí)間,但一般是少比基于字典的溶液有效,盡管它是在它的意圖可以說是更清晰。
添加回答
舉報(bào)