gpt4 book ai didi

python - 如果第一个元素重复,则从列表中删除元组的大多数 pythonic 方法

转载 作者:行者123 更新时间:2023-11-28 19:48:52 25 4
gpt4 key购买 nike

我目前的代码非常难看:

orig = [(1,2),(1,3),(2,3),(3,3)]
previous_elem = []
unique_tuples = []
for tuple in orig:
if tuple[0] not in previous_elem:
unique_tuples += [tuple]
previous_elem += [tuple[0]]
assert unique_tuples == [(1,2),(2,3),(3,3)]

必须有一个更 pythonic 的解决方案。

最佳答案

如果您不关心为重复项返回哪个元组轮次,您可以随时将列表转换为字典并返回:

>>> orig = [(1,2),(1,3),(2,3),(3,3)]
>>> list(dict(orig).items())
[(1, 3), (2, 3), (3, 3)]

如果您想返回第一个 元组轮次,您可以反转列表两次并使用OrderedDict。 ,像这样:

>>> from collections import OrderedDict
>>> orig = [(1,2),(1,3),(2,3),(3,3)]
>>> new = list(OrderedDict(orig[::-1]).items())[::-1]
[(1, 2), (2, 3), (3, 3)]

这些不是最有效的解决方案(如果这很重要),但它们确实是很好的惯用单行代码。


一些基准测试

请注意速度上的差异,如果您不关心返回的是哪一轮元组,第一个选项的效率要高得多:

>>> import timeit
>>> setup = '''
orig = [(1,2),(1,3),(2,3),(3,3)]
'''
>>> print (min(timeit.Timer('(list(dict(orig).items()))', setup=setup).repeat(7, 1000)))
0.0015771419037069459

相比于

>>>setup = '''
orig = [(1,2),(1,3),(2,3),(3,3)]
from collections import OrderedDict
'''
>>> print (min(timeit.Timer('(list(OrderedDict(orig[::-1]).items())[::-1])',
setup=setup).repeat(7, 1000)))
0.024554947372323

根据这些速度测试,第一个选项快了将近 15 倍。

话虽这么说,Saksham's answer也是 O(n) 并且在效率方面打破了这些字典方法:

>>> setup = '''
orig = [(1,2),(1,3),(2,3),(3,3)]
newlist = []
seen = set()
def fun():
for (a, b) in orig:
if not a in seen:
newlist.append((a, b))
seen.add(a)
return newlist
'''
>>> print (min(timeit.Timer('fun()', setup=setup).repeat(7, 1000)))
0.0004833390384996095

关于python - 如果第一个元素重复,则从列表中删除元组的大多数 pythonic 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29563953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com