如何以最 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.197656606000237,Chris
9.972954122000374