Создать пустой список в Python с определенным размером


546

Я хочу создать пустой список (или любой другой способ), который может содержать 10 элементов.

После этого я хочу присвоить значения в этом списке, например, это должно отображать от 0 до 9:

s1 = list();
for i in range(0,9):
   s1[i] = i

print  s1

Но когда я запускаю этот код, он генерирует ошибку или в другом случае просто отображает [](пусто).

Может кто-нибудь объяснить, почему?



7
«Пустой список» ( []) по определению имеет ноль элементов. То , что вы , по- видимому хотите список falsy значений , как None, 0, или ''.
Ден04

Чтобы создать список из , 0чтобы 9вы должны реально использовать for i in range(0, 10), какие средства for (int i = 0, i < 10, i++).
Atcold

Ответы:


833

Вы не можете присвоить списку подобное lst[i] = something, если список уже не инициализирован хотя бы с i+1элементами. Вам нужно использовать append для добавления элементов в конец списка. lst.append(something),

(Вы можете использовать нотацию присваивания, если вы используете словарь).

Создание пустого списка:

>>> l = [None] * 10
>>> l
[None, None, None, None, None, None, None, None, None, None]

Присвоение значения существующему элементу из приведенного выше списка:

>>> l[1] = 5
>>> l
[None, 5, None, None, None, None, None, None, None, None]

Имейте в виду, что что-то подобное l[15] = 5все равно не получится, так как в нашем списке всего 10 элементов.

range (x) создает список из [0, 1, 2, ... x-1]

# 2.X only. Use list(range(10)) in 3.X.
>>> l = range(10)
>>> l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Использование функции для создания списка:

>>> def display():
...     s1 = []
...     for i in range(9): # This is just to tell you how to create a list.
...         s1.append(i)
...     return s1
... 
>>> print display()
[0, 1, 2, 3, 4, 5, 6, 7, 8]

Понимание списка (используя квадраты, потому что для диапазона вам не нужно делать все это, вы можете просто вернуться range(0,9)):

>>> def display():
...     return [x**2 for x in range(9)]
... 
>>> print display()
[0, 1, 4, 9, 16, 25, 36, 49, 64]

17
Что вы подразумеваете под «Вы не можете назначить список как lst [i] = что-то» - конечно, вы можете! То, что вы не можете сделать, это назначить несуществующий элемент за пределами текущей длины списка
Сергей,

5
«если список уже не инициализирован хотя бы с i + 1 элементами» ....
MrR

5
Вы можете сделать это:a = [0 for _ in range(10)]
Камиар

Возможно ли это сделать с помощью функции list ()?
Рауль Кьярелла

126

Попробуйте это вместо:

lst = [None] * 10

Выше будет создан список размером 10, где каждая позиция инициализируется None. После этого вы можете добавить к нему элементы:

lst = [None] * 10
for i in range(10):
    lst[i] = i

По общему признанию, это не Pythonic способ сделать вещи. Лучше сделать это:

lst = []
for i in range(10):
    lst.append(i)

Или даже проще , в Python 2.x вы можете сделать это, чтобы инициализировать список со значениями от 0 до 9:

lst = range(10)

И в Python 3.x:

lst = list(range(10))

2
Другая замечательная вещь в этом заключается в том, что вы можете инициализировать список со значениями по умолчанию. lst = [''] * 10илиlst = [0] * 10
Энтони Мэннинг-Франклин

2
Вариант на примере понимания. Если все элементы в массиве необходимости быть пустыми при инициализации, используйте: arr = [None for _ in range(10)].
Дуг Р.

87

в настоящее время принятый ответ Варунла

 >>> l = [None] * 10
 >>> l
 [None, None, None, None, None, None, None, None, None, None]

Хорошо работает для не ссылочных типов, таких как числа. К сожалению, если вы хотите создать список списков, вы столкнетесь с ошибками ссылок. Пример в Python 2.7.6:

>>> a = [[]]*10
>>> a
[[], [], [], [], [], [], [], [], [], []]
>>> a[0].append(0)
>>> a
[[0], [0], [0], [0], [0], [0], [0], [0], [0], [0]]
>>> 

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

def init_list_of_objects(size):
    list_of_objects = list()
    for i in range(0,size):
        list_of_objects.append( list() ) #different object reference each time
    return list_of_objects


>>> a = init_list_of_objects(10)
>>> a
[[], [], [], [], [], [], [], [], [], []]
>>> a[0].append(0)
>>> a
[[0], [], [], [], [], [], [], [], [], []]
>>> 

Вероятно, существует встроенный способ Python по умолчанию (вместо написания функции), но я не уверен, что это такое. Был бы рад исправить!

Изменить: это [ [] for _ in range(10)]

Пример :

>>> [ [random.random() for _ in range(2) ] for _ in range(5)]
>>> [[0.7528051908943816, 0.4325669600055032], [0.510983236521753, 0.7789949902294716], [0.09475179523690558, 0.30216475640534635], [0.3996890132468158, 0.6374322093017013], [0.3374204010027543, 0.4514925173253973]]

19
Я слышал, что использование appendочень часто уступает списку пониманий. Вы можете создать свой список списков через [ [] for _ in range(10)].
М.Херцкамп,

10
Проголосовал, потому что я злился, потому что у меня был многомерный массив с одними и теми же данными, повторенными несколько раз, и я не мог понять, что происходило, прежде чем наконец нашел этот ответ. ^^ Я не понимаю, почему он так низок.
Брегалад

19

Вы можете .append(element)в список, например: s1.append(i). В настоящее время вы пытаетесь получить доступ к элементу ( s1[i]), который не существует.


16

Есть два «быстрых» метода:

x = length_of_your_list
a = [None]*x
# or
a = [None for _ in xrange(x)]

Похоже, что [None]*xбыстрее:

>>> from timeit import timeit
>>> timeit("[None]*100",number=10000)
0.023542165756225586
>>> timeit("[None for _ in xrange(100)]",number=10000)
0.07616496086120605

Но если вы в порядке с диапазоном (например [0,1,2,3,...,x-1]), тогда range(x)может быть быстрее:

>>> timeit("range(100)",number=10000)
0.012513160705566406

Обратите внимание, что в Python3 вам придется использовать list(range(n))вместо этого, так как range()не возвращает список, но является итератором, и это не быстрее, чем [None] * n.
Skillmon нравится topanswers.xyz

10

Я удивлен, что никто не предлагает такой простой подход к созданию списка пустых списков. Это старая ветка, но для полноты добавлю это. Это создаст список из 10 пустых списков

x = [[] for i in range(10)]

7
Наиболее важное различие между выполнением вышеуказанного и выполнением x = [[]] * 10состоит в том, что в последнем каждый элемент в списке указывает на один и тот же объект списка . Поэтому, если вам просто не нужно 10 копий одного и того же объекта, используйте rangeбазовый вариант, поскольку он создает 10 новых объектов. Я нашел это различие очень важным.
Мандип Санду

6

(Это было написано на основе оригинальной версии вопроса.)

Я хочу создать пустой список (или как лучше) может содержать 10 элементов.

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

но когда я запускаю его, результат []

print display s1неверный синтаксис; основываясь на вашем описании того, что вы видите, я полагаю, вы имели в виду display(s1)и тогда print s1. Для этого вы должны предварительно определить глобал s1для передачи в функцию.

Вызов displayне изменяет список, который вы передаете, как написано. Ваш код говорит « s1это имя для того, что было передано в функцию; хорошо, теперь первое, что мы сделаем, это полностью забудем об этом, и давайте s1вместо этого начнем ссылаться на вновь созданное list. Теперь мы изменим это». list». Это не влияет на значение, которое вы передали.

Здесь нет причин для передачи значения. (Нет реальной причины для создания функции, но это не относится к делу.) Вы хотите что-то «создать», так что это результат вашей функции. Для создания того, что вы описываете, не требуется никакой информации, поэтому не передавайте никакой информации return.

Это даст вам что-то вроде:

def display():
    s1 = list();
    for i in range(0, 9):
        s1[i] = i
    return s1

Следующая проблема, которую вы заметите, состоит в том, что в вашем списке будет всего 9 элементов, потому что конечная точка пропускается rangeфункцией. (Как следует из примечаний, []работает точно так же list(), точка с запятой не нужна, s1плохое имя для переменной, и для rangeначала вам нужен только один параметр 0.) Итак, в итоге вы получите

def create_list():
    result = list()
    for i in range(10):
        result[i] = i
    return result

Тем не менее, это все еще не хватает цели; rangeэто не какое - то магическое ключевое слова , которое является частью языка так forи defесть, но вместо того, чтобы это функция. И угадайте, что возвращает эта функция? Это верно - список этих целых чисел. Таким образом, вся функция рушится

def create_list():
    return range(10)

и теперь вы понимаете, почему нам вообще не нужно самим писать функцию; rangeэто уже та функция, которую мы ищем. Хотя, опять же, нет необходимости или причины для «предварительного размера» списка.


4

Один простой способ создать 2D матрицу размера nс использованием вложенных списков:

m = [[None for _ in range(n)] for _ in range(n)]

3

Я немного удивлен, что самый простой способ создать инициализированный список - это ни один из этих ответов. Просто используйте генератор в listфункции:

list(range(9))

1
Немного любопытно, почему кто-то еще комментирует это ... Я новичок на питоне, и мне кажется, что это путь, но никто ничего не говорит. Может быть, функция диапазона может быть дорогой или что-то?
AFP_555

3
Эта проблема в том, что этот ответ не создает пустой список в соответствии с вопросом, в результате вы получите [0, 1, 2, 3, 4, 5, 6, 7, 8], что и делает функция range (9) , Предполагается, что создание списка Nones полезно, а не заполнение его номерами сразу
Spcogg, второе,

Почему завернуть range(9)в систему list()? range(9)Уже не возвращает список?
Зил

2
@Zyl range- это не список и не генератор. Это встроенный неизменяемый подкласс Sequence.
Нуно Андре

1
@ AFP_555 Я думаю, что реальный вопрос заключается в том, почему за него больше не голосуют, так как он на самом деле не отвечает на вопрос и может иметь плохие непредвиденные последствия.
Эрик

1

Вот мой код для списка 2D в Python, который будет читать нет. строк из ввода:

empty = []
row = int(input())

for i in range(row):
    temp = list(map(int, input().split()))
    empty.append(temp)

for i in empty:
    for j in i:
        print(j, end=' ')
    print('')

0

Принятый ответ имеет несколько ошибок. Например:

>>> a = [{}] * 3
>>> a
[{}, {}, {}]
>>> a[0]['hello'] = 5
>>> a
[{'hello': 5}, {'hello': 5}, {'hello': 5}]
>>> 

Таким образом, каждый словарь относится к одному и тому же объекту. То же самое верно, если вы инициализируете с массивами или объектами.

Вы можете сделать это вместо этого:

>>> b = [{} for i in range(0, 3)]
>>> b
[{}, {}, {}]
>>> b[0]['hello'] = 6
>>> b
[{'hello': 6}, {}, {}]
>>> 

-2

Я наткнулся на этот ТАК вопрос при поиске аналогичной проблемы. Мне пришлось построить 2D-массив, а затем заменить некоторые элементы каждого списка (в 2D-массиве) элементами из dict. Затем я наткнулся на этот ТАК вопрос, который помог мне, может быть, это поможет другим новичкам обойти. Ключевой трюк состоял в том, чтобы инициализировать 2D-массив в виде массива с последующим использованием array[i,j]вместо array[i][j].

Для справки это кусок кода, где я должен был использовать это:

nd_array = []
for i in range(30):
    nd_array.append(np.zeros(shape = (32,1)))
new_array = []
for i in range(len(lines)):
    new_array.append(nd_array)
new_array = np.asarray(new_array)
for i in range(len(lines)):
    splits = lines[i].split(' ')
    for j in range(len(splits)):
        #print(new_array[i][j])
        new_array[i,j] = final_embeddings[dictionary[str(splits[j])]-1].reshape(32,1)

Теперь я знаю, что мы можем использовать понимание списка, но для простоты я использую вложенный цикл for. Надеюсь, что это помогает другим, кто сталкивается с этим постом.


-2

Сделайте его более функциональным.

def createEmptyList(length,fill=None):
    '''
    return a (empty) list of a given length
    Example:
        print createEmptyList(3,-1)
        >> [-1, -1, -1]
        print createEmptyList(4)
        >> [None, None, None, None]
    '''
    return [fill] * length

-3
s1 = []
for i in range(11):
   s1.append(i)

print s1

Чтобы создать список, просто используйте следующие скобки: "[]"

Чтобы добавить что-то в список, используйте list.append ()


-3

Этот код генерирует массив, который содержит 10 случайных чисел.

import random
numrand=[]
for i in range(0,10):
   a = random.randint(1,50)
   numrand.append(a)
   print(a,i)
print(numrand)

3
Добро пожаловать в ТАК. Ваш ответ на самом деле не касается вопроса. Взгляните на stackoverflow.com/help/how-to-answer
Ник
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.