如何以最Python的方式按元组的第一个值创建唯一的元组列表?
示例:
list_of_tuples = [('a', 1), ('a', 2), ('b', 3)]
# Apply here magical Pythonic one liner.
print(list_of_tuples)
[('a', 1), ('b', 3)]
答案 0 :(得分: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)]
答案 1 :(得分:1)
这是一只熊猫大班轮:
import pandas as pd
pd.DataFrame([('a', 1), ('a', 2), ('b', 3)]).groupby(0).min().to_dict()[1]
# {'a': 1, 'b': 3}
答案 2 :(得分:0)
最Python的方法是使用设置的理解力和映射来解决该问题,以获取原始值。就像是
SELECT tasks.*
FROM tasks
LEFT JOIN priorities ON tasks.priority_identifier LIKE CONCAT('%', priorities.identifier)
WHERE priority.id = 10
但是不要误解我的意思,我喜欢chris的回答,它效率更高。我的系统使用double for循环,因此在技术上是可行的,但是可以通过提高效率的方式来实现。
答案 3 :(得分:-2)
字典的构造函数采用元组列表。该对中的第一个元素必须是可哈希的才能起作用:
list(dict(list_of_tuples).items())
更新:该解决方案不仅比@Chris更简单,而且快了近一个数量级。对于在元组中的第一个值几乎总是相同(通常不是相同)并且第一个值大致均匀分布的情况下,我得到following timeit
s:
几乎所有相同的第一值:Scott 2.229072586997063,Chris 11.897218765003345
许多相同的第一值:Scott 2.077339955998468,Chris 10.501757369002007
甚至分配了第一个值:斯科特2.197656606000237,克里斯9.972954122000374