Гарантируется ли в списке Python, что его элементы остаются в том порядке, в котором они вставлены?

318

Если у меня есть следующий код Python

>>> x = []
>>> x = x + [1]
>>> x = x + [2]
>>> x = x + [3]
>>> x
[1, 2, 3]

Будет xли гарантировано всегда [1,2,3], или возможны другие заказы промежуточных элементов?

samoz
источник

Ответы:

480

Да, порядок элементов в списке Python является постоянным.

ПГОС
источник
17
Это правильный ответ, поэтому я не хочу добавлять другой. Он мог также использовать list.append, чтобы действительно успокоить его. docs.python.org/2/tutorial/datastructures.html
NG.
1
Что делать, если я возвращаю локальный список из функции и использую его в вызывающей функции. То есть def fn_1(): lst = [] lst.append(1) lst.append(2) return lstи def fn_2(): print(fn_1())порядок будет ВСЕГДА, независимо от того, сколько раз или где я использую fn_1 ()?
TheCuriousOne
6
Да, порядок элементов в списке Python является постоянным. ;)
ПГОС
82

Короче да, порядок сохранился. В длинных:

В общем случае следующие определения всегда будут применяться к объектам, таким как списки:

список представляет собой набор элементов , которые могут содержать повторяющиеся элементы и имеют определенный порядок, как правило , не изменяется , если явно не сделано , чтобы сделать это. стеки и очереди - это оба типа списков, которые обеспечивают определенное (часто ограниченное) поведение для добавления и удаления элементов (стеки - это LIFO, а очереди - это FIFO). Списки - это практические представления о списках вещей. Строка может рассматриваться как список символов, так как важен порядок ( "abc" != "bca"), и дубликаты в содержимом строки, безусловно, разрешены ( "aaa"могут существовать и != "a").

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

Коллекция - это общий термин, относящийся к любому объекту, который используется для хранения (обычно переменного) числа других объектов. Оба списка и наборы являются типом коллекции. Кортежи и массивы обычно не считаются коллекциями. Некоторые языки считают карты (контейнеры, которые описывают связи между различными объектами) также типом коллекции.

Эта схема именования действует для всех известных мне языков программирования, включая Python, C ++, Java, C # и Lisp (в которых списки, не соблюдающие порядок, были бы особенно катастрофическими). Если кто-то знает, где это не так, просто скажите, и я отредактирую свой ответ. Обратите внимание, что конкретные реализации могут использовать другие имена для этих объектов, такие как вектор в C ++ и flex в ALGOL 68 (оба списка; flex технически является просто массивом изменяемого размера).

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

Если у нас есть

list1 = [0, 1, 2, 3, 4]
list2 = [5, 6, 7, 8, 9]

затем

list1 + list2

Такой же как

[0, 1, 2, 3, 4] + [5, 6, 7, 8, 9]

Который оценивает

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Так же, как

"abdcde" + "fghijk"

Производит

"abdcdefghijk"
ApproachingDarknessFish
источник
1
Я где-то читал, что, поскольку спецификация массива JSON не указывает, что массивы поддерживают порядок массивов, операции не гарантируют поддержание порядка. Я не могу найти источник для этого, хотя. А базовая структура массива по-прежнему является особым случаем объекта с пронумерованными индексами, так что это не противоречит вашему утверждению, просто интересный кусок, подумал я.
Multihunter
1
Я не согласен с экспликацией множества. Наборы определенно не «ориентированы больше на математические и теоретические цели, чем на реальные». Вместо этого наборы очень полезны в любое время, когда требуется коллекция, содержащая элементы, которые невозможно повторить, и предлагающие такие инструменты, как различие и пересечение, которые полезны при моделировании реальных вариантов использования.
Пинтун
1
@Pintun оглядываясь назад через несколько лет после написания этого поста, я согласен с вами. Я отредактирую, как только найду лучший способ выразить то, к чему я стремился.
Приближается к
5

Вы путаете «наборы» и «списки». Набор не гарантирует порядок, но списки делают.

Наборы объявляются с помощью фигурных скобок: {}. В отличие от этого , списки объявляются с помощью квадратных скобок: [].

mySet = {a, b, c, c}

Не гарантирует порядок, но список делает:

myList = [a, b, c]
Джонатан Маккелл
источник
1
Обратите внимание, что набор также гарантирует отсутствие дублирования. Список может содержать повторяющиеся элементы, а набор - нет.
Натаниэль Форд
4

Я предполагаю, что одна вещь, которая может касаться вас, может ли записи измениться, так что 2 становится, например, другим числом. Вы можете расслабиться здесь, потому что в Python целые числа неизменны , то есть они не могут измениться после того, как они созданы.

Однако не все в Python является неизменным. Например, списки являются изменяемыми - они могут изменяться после создания. Так, например, если у вас был список списков

>>> a = [[1], [2], [3]]
>>> a[0].append(7)
>>> a
[[1, 7], [2], [3]]

Здесь я изменил первую запись a(я добавил7 к ней). Кто-то может представить себе что-то путать и получать неожиданные вещи, если вы не будете осторожны (и действительно, это случается со всеми, когда они так или иначе начинают программировать на Python; просто ищите на этом сайте «изменение списка во время циклического прохождения»). это "чтобы увидеть десятки примеров).

Также стоит отметить, что x = x + [a]и x.append(a)это не то же самое. Второй мутирует x, а первый создает новый список и назначает его x. Чтобы увидеть разницу, попробуйте установить, y = xпрежде чем что-то добавлять, xи попробовать каждый из них, и посмотрите на разницу между ними y.

asmeurer
источник
0

ALIST = [1,2,3]

I = 0

for item in aList:  

    if i<2:  

            aList.remove(item)  

    i+=1  

список

[2]

Мораль заключается в том, что при изменении списка в цикле, управляемом списком, необходимо выполнить два шага:

aList=[1,2,3]
i=0
for item in aList:
    if i<2:
        aList[i]="del"
    i+=1

aList

['del', 'del', 3]
for i in range(2):
    del aList[0]

aList
[3]
Ральфи мальчик
источник
0

Да, списки и кортежи всегда упорядочены, а словари - нет.

Ysh
источник
1
За исключением Python 3: D
mbeacom