迭代地构建元组集

时间:2015-11-17 23:00:29

标签: python

我正在尝试使用set.add(tuple)迭代地构建一组元组。问题是第一个元组不会被封装为元组。其成员作为独特元素进入集合。

# What I'd like to do
s = set((1,2))
s.add((3,4))
s.add((5,6))

>>>s
>>>{1, 2, (3, 4), (5, 6)}

当然,我可以将整个事物构建为元组列表,然后将其转换为集合,但我想知道是否可以避免从列表转换为设置。

# Works with some extra work
l = [(1,2)]
l.append((3,4))
l.append((5,6))
s = set(l)

>>>s
>>>> {(1, 2), (3, 4), (5, 6)}

感谢。

3 个答案:

答案 0 :(得分:3)

你应该像这样创建你的集合:

s = {(1, 2)}

如果不这样做,set()“构造函数”会解压缩元组中的所有元素并将它们添加到新的空集中。

答案 1 :(得分:2)

在Python 2.7及更高版本中,您可以使用set literal:

s = {(1, 2)}

如果您想使用set创建一个元素为thing的集合,则执行

s = set([thing])

其中set的参数是1元素列表。如果thing是(1,2)`,那意味着你做

s = set([(1, 2)])

答案 2 :(得分:1)

单参数set构造函数将可迭代的东西放入集合中。特别是,它不接受对象并创建包含该对象的单例集。

您没有收到错误,因为元组是可迭代的; set构造函数尽职地将元组的每个元素添加到集合中。

最好使用构造函数{(1,2)}而不是set(((1,2),))set([(1,2)]);重载{...}语法以允许创建set个实例以及dict instancess。 (但你不能用这种方式设置空集;面对歧义,python假设dict