Bagaimana cara menyusun ulang daftar? [Tutup]

108

Jika saya memiliki daftar, [a,b,c,d,e]bagaimana cara menyusun ulang item dengan cara yang sewenang-wenang [d,c,a,b,e]?

Edit: Saya tidak ingin mengacaknya. Saya ingin memesan ulang dengan cara yang telah ditentukan sebelumnya. (misalnya, saya tahu bahwa elemen ke-3 di daftar lama harus menjadi elemen pertama di daftar baru)

Niyaz
sumber
Mungkin duplikat stackoverflow.com/questions/976882/…
kgiannakakis
4
Tanpa menentukan bagaimana Anda ingin memesan barang itu sulit untuk dijawab. Apakah Anda ingin menyortirnya? Kocok mereka? Hapus beberapa dari mereka?
Mizipzor
@tvanfosson: Dalam kasus ini, arbitrer juga bisa berarti: menggunakan fungsi sortir arbitrer (tapi terdefinisi dengan baik).
Felix Kling
1
@mizipzor Saya ingin mengatur ulang dengan cara yang telah ditentukan sebelumnya. (Mengedit pertanyaan untuk mengklarifikasi ini)
Niyaz
@SilentGhost Ini akan memiliki indeks baru. Mungkin 4. Intinya adalah saya tahu urutan baru item tersebut.
Niyaz

Jawaban:

226

Anda bisa melakukannya seperti ini

mylist = ['a', 'b', 'c', 'd', 'e']
myorder = [3, 2, 0, 1, 4]
mylist = [mylist[i] for i in myorder]
print(mylist)         # prints: ['d', 'c', 'a', 'b', 'e']
AJ.
sumber
1
Ini menciptakan variabel baru. Bagaimana cara memesan ulang daftar di tempat? Terima kasih
Bingung
@Confounded Cukup ubah baris terakhir menjadi:mylist[:] = [mylist[i] for i in myorder]
Adam
13
>>> a = [1, 2, 3]
>>> a[0], a[2] = a[2], a[0]
>>> a
[3, 2, 1]
SilentGhost
sumber
1
Saya hanya tidak dapat memahami sintaksnya sampai saya menyadari adalah tugas simultan berpasangan . ´ :-)
loved.by.Yesus
11
>>> import random
>>> x = [1,2,3,4,5]
>>> random.shuffle(x)
>>> x
[5, 2, 4, 3, 1]
Menandai
sumber
@ wenlibin02, jalankan saja di bawah 2.7.5 dan masih berfungsi dengan baik. Apakah Anda mendapatkan semacam kesalahan?
Tandai
tidak ada kesalahan, saya hanya mengetik: 1) import random; x = [1, 2, 3]; random.shuffle (x); #it ​​mengembalikan Tidak ada; dan 2) Saya mencoba np.random.shuffle. Hasilnya sama.
Libin Wen
Oh maaf! Saya tidak menyadari bahwa saya langsung mengubah nilai x. Itu mengembalikan Tidak ada. Dan itu berhasil. Terima kasih.
Libin Wen
6

Apakah urutan terakhir ditentukan oleh daftar indeks?

>>> items = [1, None, "chicken", int]
>>> order = [3, 0, 1, 2]

>>> ordered_list = [items[i] for i in order]
>>> ordered_list
[<type 'int'>, 1, None, 'chicken']

edit: meh. AJ lebih cepat ... Bagaimana cara menyusun ulang daftar dengan python?

Raphaël Saint-Pierre
sumber
3
>>> a=["a","b","c","d","e"]
>>> a[0],a[3] = a[3],a[0]
>>> a
['d', 'b', 'c', 'a', 'e']
anjing hantu74
sumber
2

Anda dapat memberikan fungsi sortir Anda sendiri untuk list.sort():

Metode sort () mengambil argumen opsional untuk mengontrol perbandingan.

  • CMP menentukan fungsi perbandingan kebiasaan dua argumen (daftar item) yang harus kembali negatif, nol atau angka positif tergantung pada apakah argumen pertama dianggap lebih kecil dari, sama dengan, atau lebih besar dari argumen kedua: cmp=lambda x,y: cmp(x.lower(), y.lower()). Nilai defaultnya adalah None.

  • kunci menentukan fungsi satu argumen yang digunakan untuk mengekstrak kunci perbandingan dari masing-masing elemen daftar: key=str.lower. Nilai defaultnya adalah None.

  • sebaliknya adalah nilai boolean. Jika disetel ke True, maka elemen daftar diurutkan seolah-olah setiap perbandingan dibalik.

Secara umum, proses konversi kunci dan balik jauh lebih cepat daripada menentukan fungsi cmp yang setara. Ini karena cmp dipanggil beberapa kali untuk setiap elemen daftar sementara tombol dan balik menyentuh setiap elemen hanya sekali.

Felix Kling
sumber
2
dan bagaimana tepatnya Anda akan menerapkan ini?
SilentGhost
@SilentGhost: Ini dimaksudkan sebagai jawaban umum. Dalam kasus OP, jawaban Anda lebih tepat. Namun demikian saya pikir penting untuk mengetahui bahwa solusi generik ada.
Felix Kling
2

Jika Anda menggunakan numpy, ada cara yang tepat untuk melakukannya:

items = np.array(["a","b","c","d"])
indices = np.arange(items.shape[0])
np.random.shuffle(indices)
print(indices)
print(items[indices])

Kode ini mengembalikan:

[1 3 2 0]
['b' 'd' 'c' 'a']
pengguna2228129
sumber
1
OP mencari pengubahan urutan tertentu, bukan pengacakan umum.
Teepeemm
2

Jika Anda tidak terlalu peduli dengan efisiensi, Anda dapat mengandalkan pengindeksan array numpy untuk membuatnya elegan:

a = ['123', 'abc', 456]
order = [2, 0, 1]
a2 = list( np.array(a, dtype=object)[order] )
Shaohua Li
sumber
1

Dari pemahaman saya tentang pertanyaan Anda, tampaknya Anda ingin menerapkan permutasi yang Anda tentukan pada a list. Ini dilakukan dengan menentukan yang lain list(sebut saja p) yang memegang indeks dari elemen asli listyang harus muncul di permutasi list. Anda kemudian menggunakan puntuk membuat baru listdengan hanya mengganti elemen di setiap posisi dengan yang indeksnya ada di posisi itu p.

def apply_permutation(lst, p):
    return [lst[x] for x in p]

arr=list("abcde")
new_order=[3,2,0,1,4]

print apply_permutation(arr,new_order)

Ini cetakan ['d', 'c', 'a', 'b', 'e'].

Ini sebenarnya membuat yang baru list, tetapi dapat dimodifikasi dengan mudah untuk mengubah aslinya "di tempat".

MAK
sumber
1

Satu hal lagi yang bisa diperhatikan adalah tafsir lain yang ditunjukkan oleh darkless

Kode dengan Python 2.7

Terutama:

  1. Susun ulang berdasarkan nilai - Sudah diselesaikan oleh AJ di atas
  2. Susun ulang menurut indeks

    mylist = ['a', 'b', 'c', 'd', 'e']
    myorder = [3, 2, 0, 1, 4]
    
    mylist = sorted(zip(mylist, myorder), key=lambda x: x[1])
    print [item[0] for item in mylist]

Ini akan mencetak ['c', 'd', 'b', 'a', 'e']

Kshitij Satpute
sumber
0
newList = [oldList[3]]
newList.extend(oldList[:3])
newList.extend(oldList[4:])
inspectorG4dget
sumber
-1

Inilah yang saya gunakan ketika saya menemukan masalah ini.

def order(list_item, i): # reorder at index i
    order_at = list_item.index(i)
    ordered_list = list_item[order_at:] + list_item[:order_at]
    return ordered_list

EX: untuk huruf kecil

order(string.ascii_lowercase, 'h'):
>>> 'hijklmnopqrstuvwxyzabcdefg'

Ini hanya menggeser daftar ke indeks tertentu

AA Ron
sumber