Pythonリストは、要素が挿入された順序のままであることを保証されていますか?


318

次のPythonコードがある場合

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

ウィルx常にあることが保証され[1,2,3]、または暫定要素の他の順序が可能ですか?

回答:


480

はい、Pythonリスト内の要素の順序は永続的です。


17
これは正解なので、もう1つ追加したくありません。また、list.appendを使用して、心を落ち着かせることができます。 docs.python.org/2/tutorial/datastructures.html
NG。

1
関数からローカルリストを返し、それを呼び出し元の関数で使用するとどうなりますか。つまりdef fn_1(): lst = [] lst.append(1) lst.append(2) return lstdef fn_2(): print(fn_1())順序が)にかかわらず、常に何回か、どこかつて私は(fn_1を使用するのと同じでしょうか?
TheCuriousOne 2016年

6
はい、Pythonリスト内の要素の順序は永続的です。;)
2016年

82

つまり、注文は保持されます。長い間:

一般に、次の定義はリストなどのオブジェクトに常に適用されます。

リストには、重複した要素を含む、明示的にそうするように作られていない限り、一般的に変化していないことを定義された順序を持つことができます要素のコレクションです。スタックキューはどちらもリストのタイプであり、要素を追加および削除するための特定の(多くの場合は制限されている)動作を提供します(スタックはLIFO、キューはFIFOです)。リストは物事のリストを実際に表現したものです。文字列は文字のリストと考えることができます。これは、順序が重要("abc" != "bca")であり、文字列の内容の重複が確実に許可されるためです("aaa"存在する可能性があるおよび!= "a")。

セットには、重複を含めることはできません要素のコレクションで、または時間にわたって変化しない場合があり非明確な順序を持っています。セットは物事のリストを表すものではなく、物事の特定の選択の範囲を説明するものです。セットの内部構造、その要素が相互にどのように格納されるかは、通常、有用な情報を伝えることを意図していません。一部の実装では、セットは常に内部的にソートされます。その他の場合、順序は単純に定義されていません(通常はハッシュ関数によって異なります)。

コレクションは、(通常は可変の)数の他のオブジェクトを格納するために使用されるオブジェクトを指す総称です。リストとセットはどちらもコレクションの一種です。タプルと配列は通常、コレクションとは見なされません。一部の言語では、マップ(異なるオブジェクト間の関連付けを記述するコンテナー)もコレクションの一種と見なされます。

この命名方式は、Python、C ++、Java、C#、Lispなど、私が知っているすべてのプログラミング言語に当てはまります(リストを順序どおりにしないと、特に壊滅的になります)。これが当てはまらない場所を誰かが知っている場合は、そのように言ってください。答えを編集します。特定の実装では、これらのオブジェクトに他の名前を使用する場合があることに注意してください。、C ++のベクトルやALGOL 68のフレックス(両方のリスト。厳密には、フレックスは単なるサイズ変更可能な配列です)。

方法の詳細により、ケースに混乱が残っている場合 +ここで記号は、リストの順序が重要であることを知ってください。そうでないと信じる十分な理由がない限り、リストの操作は常に安全に順序を維持すると想定できます。 。この場合、+記号は文字列(実際には文字のリストにすぎません)の場合とほぼ同じように動作します。リストのコンテンツを取得して、別のコンテンツの背後に配置します。

私たちが持っている場合

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"

1
JSON配列の仕様は配列が順序を維持することを指定していないため、配列操作が順序を維持することが保証されていないことをどこかで読みました。でも、その出所はわかりません。そして、配列の基礎となる構造は、番号付けされたインデックスを持つオブジェクトの特別なケースであるため、ステートメントに矛盾するものではなく、興味深い情報です。
Multihunter 2016

1
セットの説明に同意しません。セットは間違いなく「実際のものよりも数学的および理論的な目的に向けられている」わけではありません。代わりに、セットは、繰り返すことができないアイテムを含むコレクションが必要なときに非常に役立ち、実際のユースケースのモデリングに役立つ差分や交差などのツールを提供します。
Pintun

1
この投稿を書いてから数年後の@Pintunは、あなたに同意します。私が目指していたものを表現するためのより良い方法を見つけたら、編集します。
DarknessFishへの接近

5

「セット」と「リスト」を混同している。セットは順序を保証しませんが、リストは保証します。

セットは中括弧を使用して宣言されます:{}。対照的に、リストは角括弧を使用して宣言されます[]

mySet = {a, b, c, c}

順序は保証されませんが、リストは次のことを保証します。

myList = [a, b, c]

1
セット非複製保証することに注意してください。リストには重複する要素がある場合がありますが、セットにはない場合があります。
Nathaniel Ford

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)同じものではありません。2つ目は変化xし、1つ目は新しいリストを作成してに割り当てxます。違いを確認するには、それぞれにy = x何かを追加する前に設定してみてx、2つの違いを確認してくださいy


0

aList = [1,2,3]

i = 0

for item in aList:  

    if i<2:  

            aList.remove(item)  

    i+=1  

リスト

[2]

道徳は、リストによって駆動されるループでリストを変更するときに、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

はい、リストとタプルは常に順序付けされていますが、辞書はそうではありません


1
Python 3:Dを除く
mbeacom 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.