Sözlükler listesinde değerin zaten mevcut olup olmadığını kontrol edin.


123

Aşağıdaki gibi bir Python sözlük listem var:

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

Listede belirli bir anahtar / değere sahip bir sözlüğün mevcut olup olmadığını aşağıdaki gibi kontrol etmek istiyorum:

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

Yanıtlar:


270

İşte bunu yapmanın bir yolu:

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

Parantez içindeki kısım True, aksi takdirde aradığınız anahtar-değer çiftine sahip her sözlük için dönen bir üretici ifadesidir False.


Anahtar da eksik olabilirse, yukarıdaki kod size bir KeyError. getVarsayılan bir değer kullanarak ve sağlayarak bunu düzeltebilirsiniz . Varsayılan bir değer sağlamazsanız Nonedöndürülür.

if not any(d.get('main_color', default_value) == 'red' for d in a):
    # does not exist

İnanılmaz tek satırlık sözdizimi, bunun için çok zorlandım! Merak ediyorum, bize gösteren Python belgelerinde 'for' işleminden önce 'for' işlemini nereye koyabileceğimizi merak ediyorum?
sylye


2
'main_color': 'red'AND olup olmadığını test etme imkanı 'second_color':'blue'var mı?
Florent

1
İfade doğru veya yanlış olarak değerlendirildikten sonra, tekrar döngü yapmak zorunda kalmadan değer üzerinde bir eylem gerçekleştirmenin bir yolu var mı?
Bryce

veriler "null" [{"main_color": null, "second_color": "red"}, {"main_color:" green "," second_color ":" null "}] ile birlikte geldiğinde çalışmıyor
Ashok Sri

5

Belki bu yardımcı olur:

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)

3

Belki de peşinde olduğunuz şey bu satırlardaki bir işlevdir:

 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

1

@Mark Byers'ın harika cevabına ve @Florent sorusunun ardından, 2'den fazla tuşa sahip diskler listesinde 2 koşulla da çalışacağını belirtmek için:

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!')

Sonuç:

Exists!
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.