Kiểm tra xem giá trị đã tồn tại trong danh sách từ điển chưa?


122

Tôi có một danh sách các từ điển Python, như sau:

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

Tôi muốn kiểm tra xem từ điển có khóa / giá trị cụ thể đã tồn tại trong danh sách hay chưa, như sau:

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

Câu trả lời:


268

Đây là một cách để làm điều đó:

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

Phần trong dấu ngoặc đơn là một biểu thức trình tạo trả về Truecho mỗi từ điển có cặp khóa-giá trị bạn đang tìm kiếm, nếu không False.


Nếu khóa cũng có thể bị thiếu, mã trên có thể cung cấp cho bạn một KeyError. Bạn có thể sửa lỗi này bằng cách sử dụng getvà cung cấp giá trị mặc định. Nếu bạn không cung cấp giá trị mặc định , Nonesẽ được trả về.

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

Cú pháp một chữ cái tuyệt vời, tôi đã rất khó khăn cho việc này! Tôi tò mò rằng nơi nào trong các tài liệu Python cho chúng ta thấy chúng ta có thể thực sự đặt hoạt động của 'for' trước 'for'?
sylye

1
Tôi tìm thấy nó, nó được gọi là Danh sách comprehensions docs.python.org/2/whatsnew/2.0.html?highlight=comprehensions
sylye

2
Có khả năng kiểm tra xem 'main_color': 'red'AND 'second_color':'blue'có tồn tại không?
Florent

1
Có cách nào, sau khi biểu thức được đánh giá là true hoặc false, để thực hiện một hành động trên giá trị mà không phải lặp lại không?
Bryce

nó không hoạt động khi dữ liệu đi kèm với "null" [{"main_color": null, "second_color": "red"}, {"main_color:" green "," second_color ":" null "}]
Ashok Sri vào

5

Có thể điều này sẽ giúp:

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

Có lẽ một hàm dọc theo những dòng này là những gì bạn đang theo đuổi:

 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

Dựa trên câu trả lời tuyệt vời của @Mark Byers và theo sau câu hỏi @Florent, chỉ để chỉ ra rằng nó cũng sẽ hoạt động với 2 điều kiện trong danh sách các dics có nhiều hơn 2 khóa:

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

Kết quả:

Exists!
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.