Python 仅基于元组某些值的重复将列表转换为集合

Python 仅基于元组某些值的重复将列表转换为集合,python,python-3.x,set,Python,Python 3.x,Set,通常,将列表转换为集合很简单,如下所示: a = [1,2,3,1] set_a = set(a) # set([1, 2, 3]) 现在,我想将元组列表转换为set,只考虑元组的第一个值 a = [(1,"a1"), (2,"b2"), (3, "c3"), (1, "d4")] set_a = some_magic(a) # 1) set_a = set([(1,"a1"), (2,"b2"), (3, "c3")]) or # 2) set_a = set([(1, "d4"),

通常,将列表转换为集合很简单,如下所示:

a = [1,2,3,1]
set_a = set(a)    # set([1, 2, 3])
现在,我想将元组列表转换为set,只考虑元组的第一个值

a = [(1,"a1"), (2,"b2"), (3, "c3"), (1, "d4")]
set_a = some_magic(a)

# 1) set_a = set([(1,"a1"), (2,"b2"), (3, "c3")]) or
# 2) set_a = set([(1, "d4"), (2,"b2"), (3, "c3")])
# Both (1) or (2) are acceptible outputs.
有没有一个“一行”的技巧可以代替上面提到的一些神奇的功能

我希望避免为簿记单独列出元组的第一个索引中已经使用了哪些(否则这将是显而易见的答案)

尝试以下方法:

set(dict(a).items())
dict(a)
将把列表变成一个字典,每次出现时键都会被覆盖

.items()
将每个键值对提取到元组列表中

set()


注意:这将给出第二个示例,保留最后一个唯一的元组键。如果您想要第一个,则需要使用列表理解的不同方法

a = [(1,"a1"), (2,"b2"), (3, "c3"), (1, "d4")]
seen = set()
print([x for x in a if x[0] not in seen and not seen.add(x[0])])
输出

[(1, 'a1'), (2, 'b2'), (3, 'c3')]
编辑

[(1, 'a1'), (2, 'b2'), (3, 'c3')]
使用口述:

print({x[0]: x for x in a}.values())

你可以转换成字典来消除重复的内容

set(dict(a).items())

{(1, 'd4'), (2, 'b2'), (3, 'c3')}

您如何决定从
(1,“a1”)
(1,“d4”)
保留哪个元组?它们都可以。。在问题中也提到了。。。