На самом деле нет способа создать такой список без цикла некоторого сортировки.Есть несколько способов скрыть цикл, как и [[]] * x
скрывает цикл.Есть понимание списка, которое «скрывает» цикл в выражении (хотя, к счастью, оно все еще очевидно.) Также есть map(list, [[]]*x)
, который имеет два скрытых цикла (один в [[]] * x
и один в map
, который создает копию каждого списка, используя list()
.)
Также есть возможность не создавать список списков заранее.Другие ответы уже охватывают простой подход, но если это как-то не соответствует вашим потребностям, есть другие способы.Например, вы можете создать функцию, которая при необходимости добавляет пустой список в список result
, и вызвать его так:
def append(L, idx, item):
while len(L) <= idx:
L.append([])
L[idx].append(item)
for i in range(x):
for j in someListOfElements:
append(result, i, j)
Или вместо списка можно использовать collections.defaultdict(list)
:
import collections
result = collections.defaultdict(list)
for i in range(x):
for j in someListOfElements:
result[i].append(j)
Это имеет преимущество использования уже существующего типа, который является менее трудоемким, но это означает, что теперь у вас есть dict (проиндексированный целыми числами) вместо списка, который может или не может быть тем, что выхочу.Или вы можете создать класс, который ведет себя почти как список, но добавляет новые списки к себе вместо вызова IndexError, например:
import UserList
class defaultlist(UserList.UserList):
def __getitem__(self, idx):
while len(self) <= idx:
self.append([])
return UserList.UserList.__getitem__(self, idx)
result = defaultlist()
for i in range(x):
for j in someListOfElements:
result[i].append(j)