2013-10-08 1 views
7

Я хочу иметь переменную, которая представляет собой вложенный список из числа пустых списков, которые я могу заполнить позже. То, что выглядит как:Как создать несколько пустых вложенных списков в python

my_variable=[[], [], [], []] 

Однако, я не знаю заранее, сколько списков мне нужно будет, только на этапе создания, поэтому мне нужна переменная a, чтобы определить его. Я думал про простой my_variable=[[]]*a, но это создает копии списков, и это не то, что я хочу иметь.

я мог бы сделать:

my_variable=[] 
for x in range(a): 
    my_variable.append([]) 

, но я ищу более элегантное решение (предпочтительно один-лайнер). Есть ли?

+3

Я думаю, вам нужно переосмыслить это. Похоже, что лучше использовать словарь для ваших нужд. Проконсультируйтесь [этот пост] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) –

+4

'my_variable = [[] for _ in xrange (a)]' – inspectorG4dget

+4

Возможный дубликат [Индекс списка Python] (http://stackoverflow.com/questions/13058458/python-list-index), [Не удается составить список списков назначенного размера] (http://stackoverflow.com/q/17411892) и [почему я не могу изменить только один элемент во вложенном списке в Python] (http://stackoverflow.com/q/10941032) –

ответ

12

Попробуйте list comprehension:

lst = [[] for _ in xrange(a)] 

Смотрите ниже:

>>> a = 3 
>>> lst = [[] for _ in xrange(a)] 
>>> lst 
[[], [], []] 
>>> a = 10 
>>> lst = [[] for _ in xrange(a)] 
>>> lst 
[[], [], [], [], [], [], [], [], [], []] 
>>> # This is to prove that each of the lists in lst is unique 
>>> lst[0].append(1) 
>>> lst 
[[1], [], [], [], [], [], [], [], [], []] 
>>> 

Однако обратите внимание, что выше для Python 2.x. На Python 3.x., так как xrange был удален, вы хотите:

lst = [[] for _ in range(a)] 
+0

У мачты у меня была черноватость, о которой я раньше не думал. :) Тем не менее, мне интересно, почему 'xrange' на Python 2.x лучше, чем' range'? Они оба работают одинаково, не так ли? –

+1

@ AndyS.c. - Не совсем. В Python 2.x 'xrange' (который возвращает итератор xrange) быстрее, чем' range' (который возвращает список). В Python 3.x. однако 'range' был сделан для выполнения того, что делает' xrange', и поэтому 'xrange' был удален. Вот ссылка: http: // stackoverflow.com/questions/135041/should-you-always-favor-xrange-over-range – iCodez

6
>>>[[] for x in range(10)] #To make a list of n different lists, do this: 
[[], [], [], [], [], [], [], [], [], []] 

Edit: -

[[]]*10 

Это даст вам тот же результат, как и выше, но список являются а не отдельные экземпляры, это всего лишь n ссылок на один и тот же экземпляр.

+4

Было бы полезно продемонстрировать, как это отличается от '[[]] * 10' – inspectorG4dget

+0

ya that good.i пропустил его. – Nullify

+2

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

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

  • Нет связанных вопросов^_^