2

我想在 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]
4

4 回答 4

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'], []]
于 2013-05-07T09:10:43.113 回答
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)

这允许一次性处理每个条件,并显着压缩您的代码。

于 2013-05-07T09:11:04.640 回答
1

而不是listItems.insert(0, tuppo),做listItems[0] = tuppo等。

于 2013-05-07T09:10:39.733 回答
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                ...
            ...
    globalList.append(listItems)
于 2013-05-07T09:11:25.283 回答