Saya punya daftar string seperti ini:
X = ["a", "b", "c", "d", "e", "f", "g", "h", "i"]
Y = [ 0, 1, 1, 0, 1, 2, 2, 0, 1 ]
Apa cara terpendek untuk menyortir X menggunakan nilai dari Y untuk mendapatkan output berikut?
["a", "d", "h", "b", "c", "e", "i", "f", "g"]
Urutan elemen yang memiliki "kunci" yang sama tidak masalah. Saya dapat menggunakan for
konstruksi tetapi saya ingin tahu apakah ada cara yang lebih pendek. Ada saran?
Jawaban:
Kode Terpendek
Contoh:
Secara umum
Dijelaskan:
zip
keduanyalist
.list
berdasarkanzip
penggunaansorted()
.list
.Untuk informasi lebih lanjut tentang cara mengatur \ gunakan
key
parameter sertasorted
fungsi secara umum, lihat ini .sumber
Masukkan kedua daftar menjadi satu, atur, lalu ambil bagian yang Anda inginkan:
Gabungkan ini bersama untuk mendapatkan:
sumber
X
daftarstr
, tetapi hati-hati jika ada kemungkinan yang<
tidak ditentukan untuk beberapa pasang barang diX
, misalnya - jika beberapa dari merekaNone
AttributeError: 'zip' object has no attribute 'sort'
itulah yang saya dapatkan sampai sekarang.sorted(zip(...))
seharusnya masih berfungsi, atau:them = list(zip(...)); them.sort()
Juga, jika Anda tidak keberatan menggunakan numpy array (atau bahkan sudah berurusan dengan numpy array ...), berikut ini adalah solusi bagus:
Saya menemukannya di sini: http://scienceoss.com/sort-one-list-by-another-list/
sumber
sortedArray1= array1[array2.argsort()]
. Dan ini juga membuatnya mudah untuk mengurutkan banyak daftar dengan kolom tertentu dari array 2D: misalnyasortedArray1= array1[array2[:,2].argsort()]
untuk mengurutkan array1 (yang mungkin memiliki banyak kolom) dengan nilai-nilai di kolom ketiga array2.Solusi yang paling jelas bagi saya adalah menggunakan
key
kata kunci arg.Perhatikan bahwa Anda dapat mempersingkat ini menjadi satu liner jika Anda ingin:
sumber
Saya sebenarnya datang ke sini mencari untuk mengurutkan daftar dengan daftar di mana nilai-nilai cocok.
sumber
index
akan melakukan pencarian O (N) untuklist_a
menghasilkanO(N² log N)
semacam.more_itertools
memiliki alat untuk mengurutkan iterables secara paralel:Diberikan
Demo
sumber
Saya suka memiliki daftar indeks yang diurutkan. Dengan begitu, saya bisa mengurutkan daftar apa pun dalam urutan yang sama dengan daftar sumber. Setelah Anda memiliki daftar indeks yang diurutkan, pemahaman daftar sederhana akan melakukan trik:
Perhatikan bahwa daftar indeks yang diurutkan juga bisa didapatkan
numpy.argsort()
.sumber
Alternatif lain, menggabungkan beberapa jawaban.
Agar dapat bekerja untuk python3:
sumber
zip, urutkan berdasarkan kolom kedua, kembalikan kolom pertama.
sumber
list(zip(*sorted(zip(X,Y), key=operator.itemgetter(1))))[0]
Satu kalimat cepat.
Katakanlah Anda ingin daftar a untuk mencocokkan daftar b.
Ini membantu ketika perlu memesan daftar yang lebih kecil untuk nilai yang lebih besar. Dengan asumsi bahwa daftar yang lebih besar berisi semua nilai dalam daftar yang lebih kecil, itu bisa dilakukan.
sumber
X
danY
?index
akan melakukan pencarian O (N) untuklist_b
menghasilkanO(N² log N)
semacam.Anda bisa membuat
pandas Series
, menggunakan daftar utama sebagaidata
dan daftar lainnya sebagaiindex
, dan kemudian hanya mengurutkan berdasarkan indeks:keluaran:
sumber
Inilah jawaban Whatangs jika Anda ingin mendapatkan kedua daftar yang diurutkan (python3).
Ingat Zx dan Zy adalah tupel. Saya juga berkeliaran jika ada cara yang lebih baik untuk melakukan itu.
Peringatan: Jika Anda menjalankannya dengan daftar kosong itu macet.
sumber
Saya telah membuat fungsi yang lebih umum, yang mengurutkan lebih dari dua daftar berdasarkan yang lain, terinspirasi oleh jawaban @ Whatang.
sumber
Untuk mendapatkan nilai unik yang ada di
list2
Untuk menemukan lokasi indeks di
list2
Lokasi indeks
list2
dilacak menggunakancur_loclist
[0, 3, 7, 1, 2, 4, 8, 5, 6]
sumber
Ini adalah pertanyaan lama tetapi beberapa jawaban yang saya lihat tidak benar-benar berfungsi karena
zip
tidak dapat skrip. Jawaban lain tidak menggangguimport operator
dan memberikan lebih banyak info tentang modul ini dan manfaatnya di sini.Setidaknya ada dua idiom yang bagus untuk masalah ini. Dimulai dengan contoh input yang Anda berikan:
Menggunakan " Hiasi-Sort-Undecorate idiom "
Ini juga dikenal sebagai Schwartzian_transform setelah R. Schwartz yang mempopulerkan pola ini di Perl pada tahun 90-an:
Perhatikan bahwa dalam hal ini
Y
danX
diurutkan dan dibandingkan secara leksikografis. Artinya, item pertama (dariY
) dibandingkan; dan jika mereka sama maka item kedua (dariX
) dibandingkan, dan seterusnya. Ini dapat membuat tidak stabil output yang kecuali jika Anda memasukkan indeks daftar asli untuk pemesanan leksikografis untuk menjaga duplikat dalam urutan aslinya.Menggunakan
operator
modulIni memberi Anda lebih banyak kontrol langsung tentang cara mengurutkan input, sehingga Anda bisa mendapatkan stabilitas pengurutan dengan hanya menyatakan kunci spesifik untuk mengurutkan berdasarkan. Lihat lebih banyak contoh di sini .
sumber