Katakanlah saya punya daftar kamus:
[
{'id': 1, 'name': 'john', 'age': 34},
{'id': 1, 'name': 'john', 'age': 34},
{'id': 2, 'name': 'hanna', 'age': 30},
]
dan saya perlu mendapatkan daftar kamus unik (menghapus duplikat):
[
{'id': 1, 'name': 'john', 'age': 34},
{'id': 2, 'name': 'hanna', 'age': 30},
]
Adakah yang bisa membantu saya dengan cara paling efisien untuk mencapai ini dengan Python?
python
dictionary
Limaaf
sumber
sumber
set(frozenset(i.items()) for i in list)
Jawaban:
Jadi buat dikt sementara dengan kuncinya adalah
id
. Ini memfilter duplikat. Thevalues()
dict akan daftarDalam Python2.7
Dalam Python3
Dalam Python2.5 / 2.6
sumber
{str(v['flight'])+':'+str(v['lon'])+','+str(v['lat']): v for v in stream}.values()
Ini hanya membuat kunci unik berdasarkan nilai-nilai Anda. Seperti'MH370:-21.474370,86.325589'
{(v['flight'], v['lon'], v['lat']): v for v in stream}.values()
OrderedDict
daricollections
list(OrderedDict((v['id'], v) for v in L).values())
atau urutkan daftar yang dihasilkan jika itu bekerja lebih baik untuk Andalist({str(i):i for i in L}.values())
Di sini kami menggunakan str (i) untuk membuat string unik yang mewakili kamus yang digunakan untuk memfilter duplikat.Cara biasa untuk menemukan hanya elemen-elemen umum dalam set adalah dengan menggunakan
set
kelas Python . Cukup tambahkan semua elemen ke set, lalu konversikan set kelist
, dan bam duplikatnya hilang.Masalahnya, tentu saja, adalah bahwa
set()
hanya dapat berisi entri hashable, dan adict
tidak hashable.Jika saya memiliki masalah ini, solusi saya adalah untuk mengkonversi masing
dict
- masing menjadi string yang mewakilidict
, kemudian menambahkan semua string keset()
kemudian membaca nilai-nilai string sebagailist()
dan dikonversi kembali kedict
.Representasi yang baik dari
dict
dalam bentuk string adalah format JSON. Dan Python memiliki modul bawaan untuk JSON (disebutjson
tentu saja).Masalah yang tersisa adalah bahwa elemen-elemen dalam a
dict
tidak diurutkan, dan ketika Python mengonversinyadict
menjadi string JSON, Anda mungkin mendapatkan dua string JSON yang mewakili kamus yang setara tetapi bukan string yang identik. Solusi mudahnya adalah meneruskan argumensort_keys=True
saat Anda meneleponjson.dumps()
.EDIT: Solusi ini mengasumsikan bahwa yang diberikan
dict
dapat memiliki bagian yang berbeda. Jika kita dapat berasumsi bahwa setiapdict
dengan nilai yang sama"id"
akan cocokdict
satu sama lain dengan nilai yang sama"id"
, maka ini berlebihan; Solusi @ gnibbler akan lebih cepat dan mudah.EDIT: Sekarang ada komentar dari André Lima secara eksplisit mengatakan bahwa jika ID adalah duplikat, aman untuk menganggap bahwa keseluruhan
dict
adalah duplikat. Jadi jawaban ini berlebihan dan saya merekomendasikan jawaban @ gnibbler.sumber
Jika kamus hanya diidentifikasi secara unik oleh semua item (ID tidak tersedia) Anda dapat menggunakan jawabannya menggunakan JSON. Berikut ini adalah alternatif yang tidak menggunakan JSON, dan akan berfungsi selama semua nilai kamus tidak dapat diubah
sumber
Anda dapat menggunakan library numpy (hanya berfungsi untuk Python2.x):
Untuk membuatnya bekerja dengan Python 3.x (dan versi numpy terbaru), Anda perlu mengubah array dicts menjadi array string numpy, misalnya
sumber
TypeError: unorderable types: dict() > dict()
saat melakukan ini di Python 3.5.Berikut ini adalah solusi yang cukup kompak, meskipun saya kira tidak terlalu efisien (secara sederhana):
sumber
map()
panggilan denganlist()
Python 3 untuk mendapatkan daftar kembali, jika tidak itu adalahmap
objek.Karena
id
cukup untuk mendeteksi duplikat, danid
hashable: jalankan melalui kamus yang memilikiid
sebagai kunci. Nilai untuk setiap tombol adalah kamus asli.Dalam Python 3,
values()
tidak mengembalikan daftar; Anda harus membungkus seluruh sisi kanan ekspresi itulist()
, dan Anda dapat menulis daging ekspresi lebih ekonomis sebagai pemahaman dict:Perhatikan bahwa hasilnya kemungkinan tidak akan berada dalam urutan yang sama seperti aslinya. Jika itu persyaratan, Anda bisa menggunakan
Collections.OrderedDict
adict
.Sebagai tambahan, mungkin cukup masuk akal untuk menyimpan data dalam kamus yang menggunakan
id
kunci as untuk memulai.sumber
output:
sumber
Memperluas jawaban John La Rooy ( Python - Daftar kamus unik ), membuatnya sedikit lebih fleksibel:
Fungsi Panggilan:
sumber
Kita bisa melakukannya
pandas
Perhatikan sedikit berbeda dari jawaban terima.
drop_duplicates
akan memeriksa semua kolom dalam panda, jika semuanya sama maka baris akan dijatuhkan.Sebagai contoh :
Jika kita mengubah
dict
nama ke-2 dari john ke petersumber
Dalam python 3.6+ (apa yang telah saya uji), cukup gunakan:
Penjelasan: kami memetakan
json.dumps
untuk menyandikan kamus sebagai objek json, yang tidak dapat diubah.set
kemudian dapat digunakan untuk menghasilkan iterable dari kekekalan yang unik . Akhirnya, kami mengonversi kembali ke representasi kamus menggunakanjson.loads
. Perhatikan bahwa pada awalnya, seseorang harus mengurutkan berdasarkan kunci untuk mengatur kamus dalam bentuk yang unik. Ini berlaku untuk Python 3.6+ karena kamus dipesan secara default.sumber
list
sebelum melakukannyaset
.Saya telah merangkum favorit saya untuk dicoba:
https://repl.it/@SmaMa/Python-List-of-unique-dictionaries
sumber
Solusi cepat dan kotor hanya dengan membuat daftar baru.
sumber
Saya tidak tahu apakah Anda hanya ingin id dicts Anda dalam daftar menjadi unik, tetapi jika tujuannya adalah untuk memiliki satu set dict di mana unicity ada pada semua nilai kunci .. Anda harus menggunakan kunci tuple seperti ini dalam pemahaman Anda:
Semoga ini bisa membantu Anda atau orang lain yang memiliki kekhawatiran ....
sumber
Ada banyak jawaban di sini, jadi izinkan saya menambahkan yang lain:
sumber
Opsi yang cukup mudah:
sumber
Baiklah semua jawaban yang disebutkan di sini bagus, tetapi dalam beberapa jawaban orang dapat menghadapi kesalahan jika item kamus memiliki daftar atau kamus bersarang, jadi saya mengusulkan jawaban sederhana
sumber
Inilah implementasi dengan overhead memori yang kecil dengan biaya tidak sekompak yang lainnya.
keluaran:
sumber
index
padalen(values)
dan menghitung mundur, itu berarti bahwa Anda dapat selalu mengurangiindex
apakah Andadel
atau tidak. mis.for index in reversed(range(len(values))):
Ini adalah solusi yang saya temukan:
Pada dasarnya Anda memeriksa apakah ID ada dalam daftar, jika ada, hapus kamus, jika tidak, tambahkan ID ke daftar
sumber