Каков самый чистый способ инициализации динамического списка в Python?

#python

#python

Вопрос:

Это вопрос, касающийся лучших методов кодирования. Предположим, мне нужно заполнить список неизвестной длины; обычно я просто инициализирую список myList = [] , но я чувствую, что это плохой способ сделать это. Я часто получаю фрагменты кода, которые выглядят так:

 list1 = []
list2 = []
list3 = []

for a,b,c in zip(x,y,z):
    list1.append(a)
    list2.append(b)
    list3.append(c)
 

Я понимаю, что в примере вы можете инициализировать эти списки до нужной длины, фактически вы можете просто использовать x,y,z их как есть. Мой вопрос касается ситуации, в которой вы не обязательно знаете длину списков. На мой взгляд, необходимость использовать три строки для инициализации этих списков является неуклюжей; что вы, ребята, делаете? Спасибо за любой вклад!

Комментарии:

1. Почему это плохая вещь? Большинство списков используются для обработки переменного количества элементов.

2. Вы имеете в виду, что не знаете, сколько списков передается zip ?

3. Нет, я просто использовал это в качестве примера, чтобы проиллюстрировать, как для инициализации списков требуется три строки кода. Я понимаю, что списки используются для хранения переменного количества элементов. Мне было интересно, есть ли способ инициализировать их более чистым способом.

4. list1 = list(x) и т.д.?

5. lists = [[] for i in range(n_lists)]

Ответ №1:

Не нужно ничего умного:

 list1 = list(x)
list2 = list(y)
list3 = list(z)
 

Комментарии:

1. Это не то, что я спросил.

2. Ах. Что вы спросили?

3. Непонятно, о чем вы спрашиваете. Это делает то же самое, что и ваш текущий цикл, только более четко и эффективно.

4. «Я понимаю, что в примере вы можете инициализировать эти списки до нужной длины, фактически вы можете просто использовать x,y,z их как есть. Мой вопрос касается ситуации, в которой вы не обязательно знаете длину списков. »

5. Длина x ? или длина (x, y, z) ? т. е. может быть не 3

Ответ №2:

Используйте список списков:

 lol = [[], [], []]
for items in zip(x, y, z):
    for i, item in enumerate(items):
        lol[i].append(item)
 

Комментарии:

1. Суть заключалась не в том, чтобы решить конкретную проблему (как говорит Эскотт в вопросе, он понимает, что может просто использовать x, y, z ), а в том, чтобы показать схему работы с несколькими списками.

2. Итак, ваше предложение — это просто список списков? Это интересная идея. Я думаю, таким же образом, как вы могли бы сделать a,b,c = [],[],[] .

3. Да, когда вы видите, что одна и та же операция выполняется с очень похожими объектами под разными именами, лучшим решением часто является помещение их в какой-либо контейнер, чтобы вы могли перебирать их и делать то же самое с каждым в цикле. Другим вариантом часто является написание функции для выполнения с ними определенных действий и передача каждого из них в функцию, но в данном случае это не совсем применимо.