Periksa apakah nilai sudah ada dalam daftar kamus?

123

Saya punya daftar kamus Python, sebagai berikut:

a = [
    {'main_color': 'red', 'second_color':'blue'},
    {'main_color': 'yellow', 'second_color':'green'},
    {'main_color': 'yellow', 'second_color':'blue'},
]

Saya ingin memeriksa apakah kamus dengan kunci / nilai tertentu sudah ada dalam daftar, sebagai berikut:

// is a dict with 'main_color'='red' in the list already?
// if not: add item
AP257
sumber

Jawaban:

270

Inilah salah satu cara untuk melakukannya:

if not any(d['main_color'] == 'red' for d in a):
    # does not exist

Bagian dalam tanda kurung adalah ekspresi generator yang mengembalikan Trueuntuk setiap kamus yang memiliki pasangan nilai kunci yang Anda cari, jika tidak False.


Jika kuncinya juga bisa hilang, kode di atas dapat memberi Anda a KeyError. Anda dapat memperbaikinya dengan menggunakan getdan memberikan nilai default. Jika Anda tidak memberikan nilai default , Nonedikembalikan.

if not any(d.get('main_color', default_value) == 'red' for d in a):
    # does not exist
Mark Byers
sumber
Sintaks satu baris yang luar biasa, saya telah mencari begitu keras untuk ini! Saya ingin tahu bahwa di mana dalam dokumen Python yang menunjukkan kepada kita bahwa kita sebenarnya dapat meletakkan operasi 'untuk' sebelum 'untuk'?
sylye
1
Saya menemukannya, namanya List Comprehensions docs.python.org/2/whatsnew/2.0.html?highlight=comprehensions
sylye
2
Apakah ada kemungkinan untuk menguji apakah 'main_color': 'red'AND 'second_color':'blue'ada?
Florent
1
Adakah cara, setelah ekspresi dievaluasi menjadi benar atau salah, untuk melakukan tindakan pada nilai tanpa harus mengulang lagi?
Bryce
tidak berfungsi saat data dilengkapi dengan "null" [{"main_color": null, "second_color": "red"}, {"main_color:" green "," second_color ":" null "}]
Ashok Sri
5

Mungkin ini membantu:

a = [{ 'main_color': 'red', 'second_color':'blue'},
     { 'main_color': 'yellow', 'second_color':'green'},
     { 'main_color': 'yellow', 'second_color':'blue'}]

def in_dictlist((key, value), my_dictlist):
    for this in my_dictlist:
        if this[key] == value:
            return this
    return {}

print in_dictlist(('main_color','red'), a)
print in_dictlist(('main_color','pink'), a)
Tony Veijalainen
sumber
3

Mungkin fungsi di sepanjang baris ini adalah apa yang Anda cari:

 def add_unique_to_dict_list(dict_list, key, value):
  for d in dict_list:
     if key in d:
        return d[key]

  dict_list.append({ key: value })
  return value
Cameron
sumber
1

Berdasarkan jawaban bagus @Mark Byers, dan mengikuti pertanyaan @Florent, hanya untuk menunjukkan bahwa itu juga akan bekerja dengan 2 kondisi pada daftar dics dengan lebih dari 2 kunci:

names = []
names.append({'first': 'Nil', 'last': 'Elliot', 'suffix': 'III'})
names.append({'first': 'Max', 'last': 'Sam', 'suffix': 'IX'})
names.append({'first': 'Anthony', 'last': 'Mark', 'suffix': 'IX'})

if not any(d['first'] == 'Anthony' and d['last'] == 'Mark' for d in names):

    print('Not exists!')
else:
    print('Exists!')

Hasil:

Exists!
Amitsas1
sumber