[英]Add element to set in the form of list comprehension in Python
我有一套套装。 我想为每个集合添加一个元素,我想用list comprehension来做这个。 这是我尝试过的:
In [1]: sets1 = [set()]
In [2]: sets2 = [{1,2}, {1,2,3}]
In [3]: [e.add(0) for e in sets1]
Out[3]: [None]
In [4]: [e.add(0) for e in sets2]
Out[4]: [None, None]
我想要的输出是:
[{0}]
[{1,2,0}, {1,2,3,0}]
为什么上面的代码返回None
而不是添加列表中的元素,以及如何使其工作?
我会建议:
[e | {0} for e in sets1]
要么:
[e.union({0}) for e in sets1]
让我们首先重新解决您的问题。
>>> test_set = set()
>>> test_set
set()
>>> print(test_set.add(0))
None
>>> test_set
{0}
>>>
如您所见, test_set.add(0)
返回None
。 但这是一个到位的操作,所以项目确实被添加了。这从上面的片段中可以看出。
如何解决问题:
在将元素设置为集合而不是使用add
方法之后,您可以进行union
。
>>> [i.union({0}) for i in sets2]
[{0, 1, 2}, {0, 1, 2, 3}]
如果要将一个列表/元素集添加到现有的集合列表中,则可以执行以下操作:
elements_to_add = [3,4,5]
>>> [i.union(set(elements_to_add)) for i in sets2]
[{1, 2, 3, 4, 5}, {1, 2, 3, 4, 5}]
但是,这不是就地操作。 在运行上面的列表理解之前和之后, sets2
将完全相同。
其实你sets1
和sets2
变量已经成为你想要的结果,因为add
语句操作sets1
,但不会产生一个新的列表。
您可以print(sets1)
print(sets2)
和print(sets2)
来作证。
在这种情况下我不会使用列表推导,简单的for
循环会更简单:
for subset in sets1:
subset.add(0)
print(sets1)
应该给你想要的输出。
我已经在评论中指出了为什么你的方法似乎不起作用:
set.add
在原地工作,不返回任何东西(因此你的None
)。 如果您需要所需的输出,请运行list-comprehension但不保存其结果。 在list-comprehension之后检查set1和set2以获得所需的输出。
所以,你可以只检查sets1
和sets2
列表解析之后。 它应该返回: [{0}]
和[{1,2,0}, {1,2,3,0}]
(顺序可能会有所不同,因为集合是无序的)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.