按元组的第一个值的唯一元组列表



如何以最 Python 的方式按元组的第一个值制作唯一的元组列表?

例:

list_of_tuples = [('a', 1), ('a', 2), ('b', 3)]
# Apply here magical Pythonic one liner.
print(list_of_tuples)
[('a', 1), ('b', 3)]

使用itertools.groupby

[next(g) for _, g in groupby(tups, key=lambda x:x[0])]

输出:

[('a', 1), ('b', 3)]

如果原始列表需要排序:

tups = [('a', 1), ('a', 2), ('b', 3), ('a', 3)]
f = lambda x:x[0]
[next(g) for _, g in groupby(sorted(tups, key=f), key=f)]

输出:

[('a', 1), ('b', 3)]

这是熊猫一行:

import pandas as pd
pd.DataFrame([('a', 1), ('a', 2), ('b', 3)]).groupby(0).min().to_dict()[1]                                                                                             
#  {'a': 1, 'b': 3}

最python的方法是通过集合理解和映射来解决这个问题,以恢复原始值。 类似的东西[*map(lambda x: next(t for t in list_of_tuples if t[0] == x), {t[0] for t in list_of_tuples})]

但不要理解我的意思,我喜欢克里斯的回答,它更有效率。我的使用双 for 循环,所以它在技术上有效,但可以提高效率。

dicts 的构造函数采用元组列表。 该对中的第一个元素需要可散列才能正常工作:

list(dict(list_of_tuples).items())

更新:此解决方案不仅比@Chris'简单,而且几乎快了一个数量级。 对于元组中的第一个值几乎总是相同、通常相同且第一个值大致均匀分布的情况,我得到以下timeit

几乎所有相同的第一值:Scott 2.229072586997063,Chris 11.897218765003345 许多相同的第一值:Scott 2.077339955998468,Chris 10.501757369002007

偶数分布的第一个值:Scott 2.197656606000237,Chris
9.972954122000374

最新更新