ตรวจสอบว่ามีค่าอยู่ในรายการพจนานุกรมหรือไม่?


123

ฉันมีรายการพจนานุกรม Python ดังนี้:

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

ฉันต้องการตรวจสอบว่าพจนานุกรมที่มีคีย์ / ค่าเฉพาะมีอยู่แล้วในรายการดังต่อไปนี้:

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

คำตอบ:


270

นี่เป็นวิธีหนึ่งที่ทำได้:

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

ส่วนในวงเล็บคือนิพจน์ตัวสร้างที่ส่งคืนTrueสำหรับพจนานุกรมแต่ละรายการที่มีคู่คีย์ - ค่าที่คุณกำลังมองหาไม่เช่นFalseนั้น


หากคีย์อาจไม่มีรหัสด้านบนสามารถให้ไฟล์KeyError. คุณสามารถแก้ไขได้โดยใช้getและระบุค่าเริ่มต้น หากคุณไม่ได้ให้ค่าเริ่มต้นค่าNoneจะถูกส่งกลับ

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

ไวยากรณ์ซับเดียวที่น่าทึ่งฉันดูยากมากสำหรับเรื่องนี้! ฉันอยากรู้ว่าเอกสาร Python ที่แสดงให้เราเห็นนั้นเราสามารถวางการทำงานของ 'for' ไว้ข้างหน้า 'for' ได้ที่ไหน?
sylye

1
ฉันพบมันเรียกว่า List Comprehensive docs.python.org/2/whatsnew/2.0.html?highlight=comparency
sylye

2
มีความเป็นไปได้ที่จะทดสอบว่ามี'main_color': 'red'AND 'second_color':'blue'อยู่หรือไม่
Florent

1
มีวิธีใดบ้างที่เมื่อนิพจน์ได้รับการประเมินเป็นจริงหรือเท็จเพื่อดำเนินการกับค่าโดยไม่ต้องวนซ้ำอีกครั้ง
Bryce

ไม่ทำงานเมื่อข้อมูลมาพร้อมกับ "null" [{"main_color": null, "second_color": "red"}, {"main_color:" green "," second_color ":" null "}]
Ashok Sri

5

สิ่งนี้อาจช่วยได้:

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

บางทีฟังก์ชันตามบรรทัดเหล่านี้อาจเป็นสิ่งที่คุณต้องการ:

 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 และทำตามคำถาม @Florent เพียงเพื่อระบุว่าจะใช้งานได้กับ 2 เงื่อนไขในรายการ dics ที่มีมากกว่า 2 คีย์:

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

ผลลัพธ์:

Exists!
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.