仅根据元组的某些值的副本将列表转换为集

时间:2019-04-01 09:55:40

标签: python python-3.x set

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

a = [1,2,3,1]
set_a = set(a)    # set([1, 2, 3])

现在,我只想将元组的第一个值转换为要设置的元组列表。

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.

是否可以使用“单行”技巧代替上面提到的some_magic函数?

我想避免为簿记单独列出一个已经使用过的元组的第一个索引(否则,这显然是个答案)

4 个答案:

答案 0 :(得分:5)

尝试一下:

set(dict(a).items())

dict(a)会将列表变成字典,其中每次出现键都会覆盖键

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

set()将其变成您想要的集合

注意:这将给您第二个示例,保留最后一个唯一的元组键。如果您想要第一个,则将需要另一种方法

答案 1 :(得分:0)

使用列表理解:

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')]

编辑

使用字典:

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

答案 2 :(得分:0)

set_a = set(
    {x[0]: x for x in a}.values()
)

答案 3 :(得分:0)

您可以将其转换为词典以消除重复项

set(dict(a).items())

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