具有固定数量元素的python列表

时间:2013-05-07 09:08:10

标签: python list

我想在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 个答案:

答案 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)