Pertanyaan Bagaimana cara mengurutkan daftar kamus berdasarkan nilai-nilai kamus dengan Python?


Saya mendapat daftar kamus dan ingin agar diurutkan berdasarkan nilai kamus itu.

Ini

[{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]

diurutkan berdasarkan nama, seharusnya menjadi

[{'name':'Bart', 'age':10}, {'name':'Homer', 'age':39}]

1340
2017-09-16 14:39


asal


Jawaban:


Mungkin terlihat lebih bersih menggunakan kunci, bukan cmp:

newlist = sorted(list_to_be_sorted, key=lambda k: k['name']) 

atau seperti yang disarankan J.F.Sebastian dan lainnya,

from operator import itemgetter
newlist = sorted(list_to_be_sorted, key=itemgetter('name')) 

Untuk kelengkapan (seperti yang ditunjukkan dalam komentar oleh fitzgeraldsteele), tambahkan reverse=True untuk mengurutkan turun

newlist = sorted(l, key=itemgetter('name'), reverse=True)

1818
2017-09-16 15:18



import operator

Untuk mengurutkan daftar kamus berdasarkan key = 'name':

list_of_dicts.sort(key=operator.itemgetter('name'))

Untuk mengurutkan daftar kamus berdasarkan kunci = 'usia':

list_of_dicts.sort(key=operator.itemgetter('age'))

109
2017-09-16 14:39



Jika Anda ingin mengurutkan daftar dengan beberapa kunci Anda dapat melakukan hal berikut:

my_list = [{'name':'Homer', 'age':39}, {'name':'Milhouse', 'age':10}, {'name':'Bart', 'age':10} ]
sortedlist = sorted(my_list , key=lambda elem: "%02d %s" % (elem['age'], elem['name']))

Ini agak bersifat hackish, karena mengandalkan pengubahan nilai menjadi representasi string tunggal untuk perbandingan, tetapi berfungsi seperti yang diharapkan untuk angka termasuk yang negatif (meskipun Anda perlu memformat string Anda secara tepat dengan zero paddings jika Anda menggunakan angka)


39
2017-09-16 14:43



my_list = [{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]

my_list.sort(lambda x,y : cmp(x['name'], y['name']))

my_list sekarang akan menjadi apa yang Anda inginkan.

(3 tahun kemudian) Diedit untuk menambahkan:

Yang baru key argumen lebih efisien dan lebih rapi. Jawaban yang lebih baik sekarang terlihat seperti:

my_list = sorted(my_list, key=lambda k: k['name'])

... lambda adalah, IMO, lebih mudah dipahami daripada operator.itemgetter, tapi YMMV.


27
2017-09-16 14:36



import operator
a_list_of_dicts.sort(key=operator.itemgetter('name'))

'kunci' digunakan untuk mengurutkan berdasarkan nilai arbitrer dan 'itemgetter' menetapkan nilai itu ke atribut 'name' masing-masing item.


20
2017-09-16 14:52



Saya kira Anda berarti:

[{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]

Ini akan disortir seperti ini:

sorted(l,cmp=lambda x,y: cmp(x['name'],y['name']))

14
2017-09-16 14:31



Anda bisa menggunakan fungsi perbandingan khusus, atau Anda bisa meneruskan fungsi yang menghitung kunci penyortiran kustom. Itu biasanya lebih efisien karena kuncinya hanya dihitung satu kali per item, sementara fungsi perbandingan akan dipanggil berkali-kali.

Anda bisa melakukannya dengan cara ini:

def mykey(adict): return adict['name']
x = [{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age':10}]
sorted(x, key=mykey)

Tetapi pustaka standar berisi rutin umum untuk mendapatkan item dari objek arbitrer: itemgetter. Jadi coba ini sebagai gantinya:

from operator import itemgetter
x = [{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age':10}]
sorted(x, key=itemgetter('name'))

12



Menggunakan transformasi Schwartzian dari Perl,

py = [{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]

melakukan

sort_on = "name"
decorated = [(dict_[sort_on], dict_) for dict_ in py]
decorated.sort()
result = [dict_ for (key, dict_) in decorated]

memberi

>>> result
[{'age': 10, 'name': 'Bart'}, {'age': 39, 'name': 'Homer'}]

Lebih lanjut tentang Perl Schwartzian berubah

Dalam ilmu komputer, transformasi Schwartzian adalah pemrograman Perl   idiom digunakan untuk meningkatkan efisiensi penyortiran daftar barang. Ini   idiom sesuai untuk pemilahan berbasis perbandingan saat pemesanan   sebenarnya berdasarkan pada pemesanan properti tertentu (kunci) dari   elemen, di mana komputasi properti itu adalah operasi intensif itu   harus dilakukan minimal beberapa kali. The Schwartzian   Transform adalah penting karena tidak menggunakan named array yang bernama.


12



Anda harus mengimplementasikan fungsi perbandingan Anda sendiri yang akan membandingkan kamus berdasarkan nilai kunci nama. Lihat Menyortir Mini-BAGAIMANA dari dari PythonInfo Wiki


11



a = [{'name':'Homer', 'age':39}, ...]

# This changes the list a
a.sort(key=lambda k : k['name'])

# This returns a new list (a is not modified)
sorted(a, key=lambda k : k['name']) 

9