リスト内のアイテムを移動しますか?


回答:


160

insertリストの方法を使用します。

l = list(...)
l.insert(index, item)

または、スライス表記を使用できます。

l[index:index] = [item]

すでにリストにあるアイテムを指定した位置に移動したい場合は、削除して新しい位置に挿入する必要があります。

l.insert(newindex, l.pop(oldindex))

22
insert / popメソッドを使用して既にリストにあるアイテムを移動すると、リストの前または後ろのどちらに移動するかによって動作が異なることに注意してください。左に移動して、選択したオブジェクトの前に挿入します。選択したアイテムの後に挿入する背面に移動します。リストの最後に移動することを確認します(インデックスエラー)。
MKaras

複数の要素を移動するには?リストa = [1,2,3,4,5,6,7,8,9]が与えられた場合、それを[1,2、[3,4,5]、6,7,8,9に変換する方法]?これは1つのステップで、またはリスト内包表記で実行できますか?
g33kz0r 2013

@MKaras私はこれをPython 3.5でテストしましたが、last index + 1エラーなく挿入できます。その場合、要素はリストに追加されるだけです。
user2061057 2016年

@ user2061057は正しいです:)大きなインデックスでも最後に挿入されます。 a.insert(99999, 1) In [14]: a Out[14]: [...., 1]
リー・ペンクマン2018

1
インデックス-1を使用して最後にアイテムを挿入しようとしている場合は、代わりにlen(l)を使用する必要があります。
nda

31

アイテムを最後まで移動するだけで、どこにも移動しない、少し短いソリューションは次のとおりです。

l += [l.pop(0)]

例えば:

>>> l = [1,2,3,4,5]
>>> l += [l.pop(0)]
>>> l
[2, 3, 4, 5, 1]

13
あなたも使うかもしれませんl.append(l.pop(0))。わずかに長くなりますが、読みやすくなっています。
coredumperror 2017年

どうすれば代わりに最初に移動できますか?

19

アイテムの位置がわからない場合は、最初にインデックスを見つける必要があります。

old_index = list1.index(item)

次に移動します。

list1.insert(new_index, list1.pop(old_index))

または私見よりきれいな方法:

try:
  list1.remove(item)
  list1.insert(new_index, item)
except ValueError:
  pass

6
私はあなたのpass発言にうんざりするのは正しいと思います...例外を隠さないでください-このような例のデフォルトは、より明確なエラー文または印刷文を提供することです... raise ValueError(f'Unable to move item to {new_index}')またはprint(f'Moving item to {new_index} failed. List remains unchanged.')pass呼び出された関数try_to_move_itemか何かでそれが操作が黙って失敗するかもしれないことを理解するようになら、多分大丈夫でしょう。
flutefreak7

3

ソリューションは非常に単純ですが、元の位置のインデックスと新しい位置のインデックスを知っている必要があります。

list1[index1],list1[index2]=list1[index2],list1[index1]

6
これは移動ではなくスワップです。
juzzlin 2016年

0

私は、timeitを使用して同じリスト内で項目を移動するいくつかの方法をプロファイルしました。以下は、j> iの場合に使用するものです。

┌──────────┬──────────────────────┐
│14.4usec│x [i:i] = x.pop(j)、│
│14.5usec│x [i:i] = [x.pop(j)]│
│15.2usec│x.insert(i、x.pop(j))│
└──────────┴──────────────────────┘

そしてここでj <= iの場合に使用するもの:

┌──────────┬───────────────────────────┐
│14.4usec│x [i:i] = x [j] ,; del x [j]│
│14.4usec│x [i:i] = [x [j]]; del x [j]│
│15.4usec│x.insert(i、x [j]); del x [j]│
└──────────┴───────────────────────────┘

数回しか使用しない場合は大きな違いはありませんが、手動による並べ替えなどの重い処理を行う場合は、最速のものを使用することが重要です。そうでなければ、私はあなたが最も読みやすいと思うものだけを取ることをお勧めします。

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