Python 如何在没有循环的情况下向set()添加生成器元素?

Python 如何在没有循环的情况下向set()添加生成器元素?,python,set,generator,Python,Set,Generator,从中可以看出,生成器不像iterables那样初始化 如何将生成器的元素添加到集合中?对于generator中的item排序并使用setname.add(item),还有比这更好的方法吗 生成器是由游标返回的。执行(“选择…”)命令从连接到sqlite3数据库的游标 您可以使用更新方法: In [3]: x = set() In [4]: g = (i**2 for i in range(5)) In [6]: x.update(g) In [7]: x Out[7]: {0, 1, 4,

从中可以看出,生成器不像iterables那样初始化

如何将生成器的元素添加到集合中?对于generator中的item排序并使用
setname.add(item)
,还有比这更好的方法吗


生成器是由
游标返回的。执行(“选择…”)
命令从连接到sqlite3数据库的游标

您可以使用
更新
方法:

In [3]: x = set()

In [4]: g = (i**2 for i in range(5))

In [6]: x.update(g)

In [7]: x
Out[7]: {0, 1, 4, 9, 16}
update
修改
x
。如果您只想返回一个新集合,可以使用
union

In [8]: x = set()

In [9]: g = (i**2 for i in range(5))

In [10]: x.union(g)
Out[10]: {0, 1, 4, 9, 16}

您可以使用
update
方法:

In [3]: x = set()

In [4]: g = (i**2 for i in range(5))

In [6]: x.update(g)

In [7]: x
Out[7]: {0, 1, 4, 9, 16}
update
修改
x
。如果您只想返回一个新集合,可以使用
union

In [8]: x = set()

In [9]: g = (i**2 for i in range(5))

In [10]: x.union(g)
Out[10]: {0, 1, 4, 9, 16}

您也可以只执行
set(gen)


(请注意,这将创建一个仅包含生成器中元素的新集合。如果要将元素添加到预先存在的集合中,则需要按照unutbu的答案进行操作。)

您也可以只执行
set(gen)



(请注意,这将创建一个仅包含生成器中元素的新集合。如果要将元素添加到预先存在的集合中,则需要按照unutbu的答案进行操作。)

这与本例中i的
是否有实际不同:x.add(i)
?我想就这些了。当给定一个生成器时,update
就可以了,但它可能会以某种方式得到优化。@AdamSmith:在做了%timeit测试后,调用
update
一次似乎比使用Python循环并多次调用
x.add
要快一些,但对于大型生成器来说差异不是很大。这是有道理的,因为
set.update
只是在C中实现的调用(至少在CPython中),但是在后台,Python仍然在生成器中循环。您也不需要内部更新
my_set.update(my_generator())
也能正常工作。@tdelaney:我的答案在
update
中没有使用
只是定义一个简单的生成器。@unutbu,很抱歉,当我应该看到生成器时,我看到了列表。这与g:x.add(i)
中的i实际不同吗?我想就这些了。当给定一个生成器时,update
就可以了,但它可能会以某种方式得到优化。@AdamSmith:在做了%timeit测试后,调用
update
一次似乎比使用Python循环并多次调用
x.add
要快一些,但对于大型生成器来说差异不是很大。这是有道理的,因为
set.update
只是在C中实现的调用(至少在CPython中),但是在后台,Python仍然在生成器中循环。您也不需要内部更新
my_set.update(my_generator())
也能正常工作。@tdelaney:我的答案在
update
中没有使用
for
只是定义一个简单的生成器。@unutbu,很抱歉,当我应该看到生成器时,我看到了列表。答案很好,但是如果您只想从生成器添加项,您甚至不需要for:
集(my_generator())
可以。@t德莱尼:我刚才用了生成器理解作为生成器的一个例子。正如我在开始时所说,set(gen)
将适用于任何生成器
gen
。我将其解释为传入生成器函数,而不是调用生成器返回的迭代器。但我现在明白你的意思了@tdelaney:从技术上讲,该函数是一个“生成器函数”,其返回值是生成器。但是,是的,我们的想法是,您将执行
gen=generator\u func()
,然后调用
set(gen)
。好吧,好奇的是,如果生成器
gen
返回元组
item
,而您只需要元组中的一个元素,
item[0]
,有什么方法可以做到这一点吗?回答得很好,但是,如果您只想从生成器中添加项,您甚至不需要for:
set(my_generator())
就可以了。@tdelaney:我只是使用生成器理解作为生成器的示例。正如我在开始时所说,set(gen)将适用于任何生成器
gen
。我将其解释为传入生成器函数,而不是调用生成器返回的迭代器。但我现在明白你的意思了@tdelaney:从技术上讲,该函数是一个“生成器函数”,其返回值是生成器。但是,是的,我们的想法是,您将执行
gen=generator\u func()
,然后调用
set(gen)
。好吧,好奇的是,如果生成器
gen
返回元组
item
,而您只需要元组中的一个元素
item[0]
,有什么方法可以做到这一点吗?