2013-05-07 3 views
2

Я хочу создать список фиксированных размеров размером 6 кортежей в Python. Обратите внимание, что в приведенном ниже коде я всегда повторно инициализирую значения во внешнем цикле, чтобы сбросить ранее созданный список, который уже был добавлен в globalList. Вот отрывок:Список python с фиксированным числом элементов

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

Вместо вставки следует присвоить эти значения. 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] 

Update:

>>> 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'], []] 
+0

Спасибо Ashwini. Это работает. Однако мой список - это список кортежей. Я имею в виду, что он имеет 6 элементов, и каждый элемент может быть кортежем. Но когда я вставляю, как указано выше, он перепишет ранее вставленный элемент. Итак, как я могу вставить кортеж. Например, мне нужно [(foo, bar), None, bar, None, None, None] – Yavar

+0

@Yavar вам, возможно, придется использовать список списков, а вместо списков None, см. Мой обновленный ответ. –

+1

Спасибо, друг! Отлично. Я - кодер C++, новый для Python, изучающий работу. Это действительно помогло мне! Принято с +1 :) – Yavar

1

Вместо listItems.insert(0, tuppo), делать listItems[0] = tuppo т.д.

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) 

Это позволяет каждому из условий, которые будут рассматриваться на одном дыхании, и он конденсируется свой код значительно.

+0

Спасибо Волатильность, что действительно помогает, действительно много! – Yavar

1

thats becauce вы вставляете имена indestead для изменения значения. do like this 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) 
Смежные вопросы