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

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

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

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

print  s1

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

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

Ответ 1

Вы не можете назначить список, например lst[i] = something. Вам нужно использовать append. lst.append(something).

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

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

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

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]

Ответ 2

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

lst = [None] * 10

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

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

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

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

Или, что еще лучше, используйте списки, подобные этому:

[i for i in range(10)]

Ответ 3

varunl принятый в настоящее время ответ

 >>> 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]]

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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

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

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

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

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

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

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

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 - это уже функция, которую мы ищем. Хотя, опять же, нет необходимости или повода для "предварительного размера" списка.