2017-02-01 4 views
3

У меня есть данные, что выглядит следующим образом:Могу ли я расширить список списков в python?

[[1, 100313], [2, 100313], [1, 100314], [3, 100315]] 

Со всем в формате строки (в противном случае я не могу итерацию)

Я хочу, чтобы запустить цикл, который смотрит через эти элементы и продолжается с [ 0, 0, 1], если он видит, второй элемент в списке, как 100313. Таким образом, в конечном счете, это будет выглядеть следующим образом:

[[1, 100313, 0, 0, 1], [2, 100313, 0, 0, 1], [1, 100314], [3, 100315]] 

Я запустить цикл, который выглядит следующим образом:

for x, y in list: 
    if y == 100313: 
     list.extend([0,0,1]) 

и он не меняет этот список вообще. Почему это?

+0

Вы, кажется, перебираете внешний список. Это для цикла разрушает внутренний список в x и y, если внутренний список имеет ровно два элемента. Но затем, когда вы пытаетесь расширить, вы вызываете расширение на ** внешний ** список. Попробуйте сделать переменную цикла весь внутренний список и проверить на 100313 в этом. Затем вызов продолжится во внутреннем списке. – zstewart

ответ

3

Вы можете сделать это с помощью list comprehension как в этом примере:

a = [[1, 100313], [2, 100313], [1, 100314], [3, 100315]] 

final = [k+[0,0,1] if k[1] == 100313 else k for k in a] 

print(final) 

Выход:

[[1, 100313, 0, 0, 1], [2, 100313, 0, 0, 1], [1, 100314], [3, 100315]] 

Обновление:

Вы попросили добавить еще один if ... else блок в одном list comprehension. Вы можете сделать это как в этом примере:

a = [[1, 100313], [2, 100313], [1, 100314], [3, 100315]] 
final = [k+[0,0,1] if k[1] == 100313 else k+[0,1,0] if k[1] == 100314 else k for k in a] 
print(final) 

Выход:

[[1, 100313, 0, 0, 1], [2, 100313, 0, 0, 1], [1, 100314, 0, 1, 0], [3, 100315]] 
+0

Спасибо, что, если я хотел бы также расширить [0,1,0], если k [1] == 100314. Может ли это все быть в одном понимании списка? – user285884

+0

вы можете использовать, если k [1] в {100313, 100314} – iklinac

+0

@iklinac, но его другое расширение ... как это сделать? – user285884

1

Если вы имеете дело с большими объемами данных и хотите, чтобы избежать неэффективного использования памяти, что лучше использовать выражение генератора. Они выглядят очень похожи на список понимания для вместо квадратных скобок они имеют круглые скобки, за исключением:

from __future__ import print_function 

a = [[1, 100313], [2, 100313], [1, 100314], [3, 100315]] 
final = (k+[0,0,1] if k[1] == 100313 else k+[0,1,0] if k[1] == 100314 else k for k in a) 

for i in final: 
    print(i, end='') 

print() 

Выражения генератора возвращает объект генератора вместо целого списка. Вы можете лениво печатать элементы один за другим, перейдя через возвращаемый генератор.

Обратите внимание, что это имеет смысл только в том случае, если у вас действительно большие списки, а не как пример вашего вопроса.

0

Использовать список [x] [y] вместо оператора y in if. И используйте список [x], а не перечислите следующую строку. Это, безусловно, будет работать. Поскольку вы пытаетесь сделать это, вы пытаетесь расширить свой список, но то, что вы на самом деле хотите, - это расширение элемента списка. Надеюсь, это поможет.

Смежные вопросы