在python中创建一组数组

Ale*_*ear 6 python set

我在设置列表时遇到问题,我认为这是因为我初始化错了,这是一种初始化并添加到5000集列表的有效方法吗?

sets = [set()]*5000
i = 0
for each in f:
    line = each.split()
    if (some statement):
        i = line[1]

    else:
        sets[i].add(line[0])
Run Code Online (Sandbox Code Playgroud)

任何建议将不胜感激

Roh*_*ain 18

您正在将引用的副本存储到每个列表索引中的单个集合中.因此,修改一个也将改变其他人.

要创建多个集的列表,可以使用列表解析:

sets = [set() for _ in xrange(5000)]
Run Code Online (Sandbox Code Playgroud)

  • 范围?→ 也许范围 (2认同)

daw*_*awg 6

这有效:

>>> lotsosets=[set() for i in range(5)]
>>> lotsosets
[set([]), set([]), set([]), set([]), set([])]
>>> lotsosets[0].add('see me?')
>>> lotsosets
[set(['see me?']), set([]), set([]), set([]), set([])]
>>> lotsosets[1].add('imma here too')
>>> lotsosets
[set(['see me?']), set(['imma here too']), set([]), set([]), set([])]
Run Code Online (Sandbox Code Playgroud)

[x]*5000如果x是不可变的,你应该只使用表单:

>>> li=[None]*5
>>> li
[None, None, None, None, None]
>>> li[0]=0
>>> li
[0, None, None, None, None]
>>> li[1]=1
>>> li
[0, 1, None, None, None]
Run Code Online (Sandbox Code Playgroud)

或者,如果对单个项目(如迭代器)进行多次引用,则会产生所需的行为:

>>> [iter('abc')]*3
[<iterator object at 0x100498410>, 
 <iterator object at 0x100498410>, 
 <iterator object at 0x100498410>]   # 3 references to the SAME object
Run Code Online (Sandbox Code Playgroud)

注意重复引用相同的迭代器,然后使用zip产生所需的行为:

>>> zip(*[iter('abcdef')]*3)
[('a', 'b', 'c'), ('d', 'e', 'f')]
Run Code Online (Sandbox Code Playgroud)

或者是更长迭代器的子集:

>>> [next(x) for x in [iter('abcdef')]*3]
['a', 'b', 'c']
Run Code Online (Sandbox Code Playgroud)

而类似的东西[list()]*5可能不会产生预期的东西:

>>> li=[list()]*5
>>> li
[[], [], [], [], []]
>>> li[0].append('whoa')
>>> li
[['whoa'], ['whoa'], ['whoa'], ['whoa'], ['whoa']]
Run Code Online (Sandbox Code Playgroud)