我在设置列表时遇到问题,我认为这是因为我初始化错了,这是一种初始化并添加到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)
这有效:
>>> 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)
| 归档时间: |
|
| 查看次数: |
15891 次 |
| 最近记录: |