【问题标题】:How do I create a list of independent sets in python? [duplicate]如何在 python 中创建独立集的列表? [复制]
【发布时间】:2013-07-27 23:23:29
【问题描述】:

我有一个需要包含可变数量独立集的列表。 当我运行以下代码时,我只想将字符串“testing”添加到第一组。

numberOfSets = 3    
test = [set()]*numberOfSets
test[0].add("testing")
print test

但是,当我打印test 时,它显示了三个相同的集合,它们都包含测试。如何设置我的列表以便我可以单独访问每个集合?

【问题讨论】:

标签: python


【解决方案1】:

当您执行[set()]*3 时,您会创建三个引用同一对象的集合,因此当您更改一个值时,其他值也会更改。在此处使用列表推导:

>>> numberOfSets = 3   
>>> test = [set() for _ in xrange(numberOfSets)]
>>> test[0].add("testing")
>>> print test
[set(['testing']), set([]), set([])]

【讨论】:

  • 谢谢,我会在10分钟内接受
  • @fdsa 不客气 :)。
  • 由于我们知道 OP 使用的是 Python 2.7,因此您可能需要更新此答案以使用 xrange;更适合这种情况。
【解决方案2】:

你可以的

test = [set() for _ in xrange(numberOfSets)]  # use 'range' in Python 3.x

[set()]*x 使用 same 集合实例的x 创建一个列表,而上面的理解在每次迭代时根据需要创建一个新的独立集合。

通常,当您将元素可变的列表相乘时,您应该非常小心。

【讨论】:

  • 感谢您提供的信息。我使用的是 Python 2.7,所以我会接受另一个答案。
  • 只是好奇,为什么要小心将元素可变的列表相乘?
  • @fdsa xrange 更适合 2.7,如上图所示。我的意思是你应该在 3.x 中使用 range
  • @fdsa xrange() 创建一个迭代器,而 range() 只是创建列表。如果您对 2.7 的性能感兴趣,那么 xrange 是您的最佳选择。然而,在 Python 3 中,xrange() 被删除,range 具有与 xrange 在 2.7 中相同的功能
  • 您要小心您所描述的确切原因:改变相乘列表中的一个元素会影响其他元素。使用不可变的列表元素,您无需担心这一点。
猜你喜欢
  • 2012-06-21
  • 1970-01-01
  • 2019-11-12
  • 2014-10-07
  • 1970-01-01
  • 2018-12-29
  • 2016-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多