Створіть порожній список у python із певним розміром


545

Я хочу створити порожній список (або все, що є найкращим способом), який може містити 10 елементів.

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

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

print  s1

Але коли я запускаю цей код, він генерує помилку або в іншому випадку він просто відображається [](порожній).

Може хтось пояснить, чому?



7
"Порожній список" ( []) за визначенням містить нульові елементи. Те , що ви , по- видимому хочете список falsy значень , як None, 0, або ''.
dan04

Щоб створити список з , 0щоб 9ви повинні реально використовувати for i in range(0, 10), які кошти for (int i = 0, i < 10, i++).
Atcold

Відповіді:


830

Ви не можете призначити такий список lst[i] = something, якщо список вже не ініціалізований принаймні i+1елементами. Щоб додати елементи в кінець списку, потрібно використовувати додавання. 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 елементів.

діапазон (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" ....
18:30,

5
ви можете це зробити:a = [0 for _ in range(10)]
Кам’яр

Чи можливо це зробити за допомогою функції list ()?
Рауль Чіарелла

125

Спробуйте це замість цього:

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)

Або ще простіше , в 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)].
Дуг Р.

85

наразі прийнята відповідь 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]]

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, що робити вище, полягає в тому, що в останньому кожен елемент списку вказує на об’єкт списку SAME . Тому, якщо ви просто не хочете 10 копій одного і того ж об'єкта, використовуйте rangeбазовий варіант, оскільки він створює 10 нових об'єктів. Я вважав цю відмінність дуже важливою.
Mandeep Sandhu

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

Я трохи здивований, що найпростіший спосіб створити ініціалізований список не в жодній із цих відповідей. Просто використовуйте генератор у listфункції:

list(range(9))

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

3
Ця проблема полягає в тому, що ця відповідь не створює порожній список відповідно до запитання, ви отримаєте [0, 1, 2, 3, 4, 5, 6, 7, 8], що і функція діапазону (9) . Припустимо, що екземпляр списку Ноні є кориснішим, а не заповнювати його цифрами одразу
Spcogg другий

Чому загорнути range(9)в систему list()? Список ще не range(9)повертається?
Зіль

2
@Zyl range- це не список, ані генератор. Це вбудований непорушний підклас Sequence.
Nuno André

@ AFP_555 Я думаю, що справжнє питання полягає в тому, чому його не рекомендують більше, оскільки він насправді не відповідає на питання і може мати погані непередбачувані наслідки.
eric

4

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

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

1

Ось мій код для двовимірного списку в 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('')

-2

Я зіткнувся з цим питанням SO під час пошуку подібної проблеми. Мені довелося скласти 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)

Тепер я знаю, що ми можемо використовувати список розуміння, але для простоти я використовую вкладений цикл. Сподіваюся, це допомагає іншим, хто натрапив на цю посаду.


-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
Ласкаво просимо до SO. Ваша відповідь насправді не стосується конкретного питання. Подивіться на stackoverflow.com/help/how-to-answer
Нік
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.