2013-05-01 4 views
0

У меня проблема с добавлением элементов в несколько списков. Моя программа выглядит следующим образом. где список - это всего лишь серия чисел.Python append для нескольких списков

for j in range(0, len(list)): 
    if (int(list[j][4]) == 0 or int(list[j][:-4]) == 41601000000): 
     filelist0.append(list[j]) 
    if (int(list[j][4]) == 1 or int(list[j][:-4]) == 41602000000): 
     filelist1.append(list[j]) 
    if (int(list[j][4]) == 2 or int(list[j][:-4]) == 41603000000): 
     filelist2.append(list[j]) 
    if (int(list[j][4]) == 3 or int(list[j][:-4]) == 41604000000): 
     filelist3.append(list[j]) 
    if (int(list[j][4]) == 4 or int(list[j][:-4]) == 41605000000): 
     filelist4.append(list[j]) 
    if (int(list[j][4]) == 5 or int(list[j][:-4]) == 41606000000): 
     filelist5.append(list[j]) 
    if (int(list[j][4]) == 6 or int(list[j][:-4]) == 41607000000): 
     filelist6.append(list[j]) 
    if (int(list[j][4]) == 7 or int(list[j][:-4]) == 41608000000): 
     filelist7.append(list[j]) 
    if (int(list[j][4]) == 8 or int(list[j][:-4]) == 41609000000): 
     filelist8.append(list[j]) 

Это некрасиво. Есть ли способ написать вышеприведенный код в строке или двух? Очевидно, я могу перебирать строки, но не для имени списков. (не может перебирать список файлов [m] для m в диапазоне (0, 9)).

Спасибо!

+0

Совет. Не используйте 'list' в качестве имени переменной. Наступает тонкий хаос. –

ответ

3

Следующие должны быть эквивалентны:

filelists = [filelist0, filelist1, filelist2, filelist3, filelist4, 
      filelist5, filelist6, filelist7, filelist8] 
for x in lst: 
    for i, filelist in enumerate(filelists): 
     if int(x[4]) == i or int(x[:-4]) == 41601000000 + i * 1000000: 
      filelist.append(x) 

Обратите внимание, что я переименовал list в lst, это не очень хорошая идея, чтобы использоваться встроенные имена для ваших переменных.

+2

+1, но нет необходимости в переменной 'j'. Цикл над 'x в lst' будет еще короче. –

+0

@larsmans Хорошая точка, спасибо за предложение. –

+1

+1 очень хороший подход. Мне нужно работать над фетишем 'dict' – mfitzp

0

Почему бы не поставить списки в dict? Вы можете использовать defaultdict для автоматического создания элемента, если его еще нет. Номер инкремента на конце выполняется% d в строке, затем с помощью int для преобразования обратно в число. Все еще некрасиво, но ты туда.

from collections import defaultdict 

filelist = defaultdict(list) 

for j in range(0, len(list)): 
    for fl in range(0, 9) #0-8 
     if (int(list[j][4]) == fl or int(list[j][:-4]) == int('4160%d000000' % fl+1)): 
      filelist[fl].append(list[j]) 
-2
filelist = [[] for _ in range(9)] 
for j, item in enumerate(item_list): 
    for i in range(9): 
     if (int(item[4])==i or 
      int(item[-4])==int('4160{}000000'/format(i+1)) 
     ): 
      filelist[i].append(j) 
      break 
0

Это решение с одним списком списков

filelists = [] 

list = [[1,3,2,6,5,7,6],[3,5,7,8,5,5,4]] 

for i in range(8): 
    filelists.append([]) 
    for j in range(0, len(list)): 
     if (int(list[j][4]) == i or int(list[j][-4]) == 41601000000): 
      print 'added' 
      filelists[i-1].append(list[j]) 

Результат

>>> filelists 
[[], [], [], [], [[1, 3, 2, 6, 5, 7, 6], [3, 5, 7, 8, 5, 5, 4]], [], [], []] 
0

Если вы используете Python 2.7 вы можете использовать функцию карты() без присвоенная переменная, например

>>> listdata = [0, 1, 2, 3, 4] 
>>> list_o_lists = [ls0, ls1, ls2, ls3, ls4] 
>>> map(lambda x, y: x.append(y), listdata, list_o_lists) 

Надеюсь, это поможет, подумал, что это было немного проще, чем другие ответы.