Saya mencoba mengurutkan daftar di bawah ini:

list1 = [('a', 1, 3), ('b', 1, 2), ('c', 2, 1)]

Berdasarkan elemen ke-2 (asc) & ke-3 (asc) dari setiap Tuple yang menghasilkan:

[('b', 1, 2), ('a', 1, 3), ('c', 2, 1)]

Saya mencoba menggunakan:

sorted(list1, key=lambda x: x[1], x[2])

Tetapi menyebabkan kesalahan:

SyntaxError: positional argument follows keyword argument
0
Mehul Gupta 4 Januari 2021, 21:07

3 jawaban

Jawaban Terbaik

Berikut caranya:

list1 = [('a', 1, 3), ('b', 1, 2), ('c', 2, 1)]

print(sorted(list1, key=lambda x: (x[1], x[2])))

Keluaran:

[('b', 1, 2), ('a', 1, 3), ('c', 2, 1)]

Alasan Anda mendapatkan kesalahan adalah karena koma masuk. Anda tahu, alih-alih menganggapnya sebagai bagian dari fungsi lambda, python menafsirkannya saat Anda mencoba meneruskan argumen lain, argumen posisi sebenarnya, ke dalam fungsi sorted.

Setiap kali memanggil suatu fungsi, meneruskan argumen kata kunci sebelum argumen posisi akan menghasilkan kesalahan yang Anda tentukan.

sorted(list1, key=lambda x: x[1], x[2])

Catatan: irisan [1:] juga berfungsi:

list1 = [('a', 1, 3), ('b', 1, 2), ('c', 2, 1)]

print(sorted(list1, key=lambda x: x[1:]))
2
Ann Zen 4 Januari 2021, 18:18

Berdasarkan pesan kesalahan, sepertinya penafsir menafsirkan key=(lambda x:x[1]) dan (x[2]) masing-masing sebagai argumen kedua dan ketiga untuk sorted(). Jika Anda meletakkan seluruh ekspresi lambda dalam tanda kurung, maka itu akan berfungsi.

0
ProjectTermina 4 Januari 2021, 18:13

Koma di lambda kunci Anda terlihat seperti akhir dari argumen untuk parser. Beri tanda kurung untuk memperjelas: key=lambda x: (x[1], x[2]).

Atau, mengiris melakukan hal yang sama dalam kasus ini: key=lambda x: x[-2:].

Selain itu, meskipun tidak masalah pada daftar yang sesingkat ini, fungsi operator.itemgetter sedikit mengungguli lambda - terakhir kali saya memeriksanya sekitar 10% percepatan pada daftar yang lebih besar. key=operator.itemgetter(1, 2).

1
Peter DeGlopper 4 Januari 2021, 18:21