我想在Python中创建一个大小为6的元组的固定大小列表。请注意,在下面的代码中,我总是重新初始化外部for循环中的值,以便重置先前创建的已添加到globalList的列表。这是一个片段:
for i,j in dictCaseId.iteritems():
listItems=[None]*6
for x,y in j:
if x=='cond':
tuppo = y
listItems.insert(0,tuppo)
if x=='act':
tuppo = y
listItems.insert(1,tuppo)
if x=='correc':
tuppo = y
listItems.insert(2,tuppo)
...
...
globalList.append(listItems)
但是当我尝试运行上面的代码(仅在上面显示的代码段)时,会增加列表大小。我的意思是,添加的东西,但我也看到列表包含更多的元素。我不希望我的列表大小增加,我的列表是6元组的列表。
例如:
Initially: [None,None,None,None,None,None]
What I desire: [Mark,None,Jon,None,None,None]
What I get: [Mark,None,Jon,None,None,None,None,None]
答案 0 :(得分:4)
而不是插入你应该分配这些值。 list.insert
在传递给它的索引处插入一个新元素,因此每次插入操作后列表的长度增加1。
另一方面,赋值修改特定索引处的值,因此长度保持不变。
for i,j in dictCaseId.iteritems():
listItems=[None]*6
for x,y in j:
if x=='cond':
tuppo = y
listItems[0]=tuppo
if x=='act':
tuppo = y
listItems[1]=tuppo
if x=='correc':
tuppo = y
listItems[2]=tuppo
示例:
>>> lis = [None]*6
>>> lis[1] = "foo" #change the 2nd element
>>> lis[4] = "bar" #change the fifth element
>>> lis
[None, 'foo', None, None, 'bar', None]
<强>更新强>
>>> lis = [[] for _ in xrange(6)] # don't use [[]]*6
>>> lis[1].append("foo")
>>> lis[4].append("bar")
>>> lis[1].append("py")
>>> lis
[[], ['foo', 'py'], [], [], ['bar'], []]
答案 1 :(得分:3)
Ashwini修复了您的主要问题,但我会在此提出建议。
因为(根据您向我们展示的内容)您只是根据条件将元素分配给特定索引,所以最好这样做:
for i, j in dictCaseId.iteritems():
listItems = [None] * 6
lst = ['cond', 'act', 'correc', ...]
for x, y in j:
idx = lst.index(x)
listItems[idx] = y
globalList.append(listItems)
或列表清单:
for i, j in dictCaseId.iteritems():
listItems = [[] for _ in xrange(6)]
lst = ['cond', 'act', 'correc', ...]
for x, y in j:
idx = lst.index(x)
listItems[idx].append(y)
globalList.append(listItems)
这允许一次性处理每个条件,并且它会显着缩小您的代码。
答案 2 :(得分:1)
取代listItems.insert(0, tuppo)
,而不是listItems[0] = tuppo
等。
答案 3 :(得分:1)
那就是你插入名字而不是改变价值。 喜欢这个indstead
for i,j in dictCaseId.iteritems():
listItems=[None]*6
for x,y in j:
if x=='cond':
tuppo = y
listItems[0] = tuppo
if x=='act':
tuppo = y
listItems[1] = tuppo
if x=='correc':
tuppo = y
listItems[2] = tuppo ...
...
globalList.append(listItems)