Cách kiểm tra nếu một giá trị tồn tại trong từ điển (python)


251

Tôi có từ điển sau trong python:

d = {'1': 'one', '3': 'three', '2': 'two', '5': 'five', '4': 'four'}

Tôi cần một cách để tìm nếu một giá trị như "một" hoặc "hai" tồn tại trong từ điển này.

Ví dụ: nếu tôi muốn biết liệu chỉ số "1" có tồn tại hay không, tôi chỉ cần gõ:

"1" in d

Và sau đó python sẽ cho tôi biết nếu đó là đúng hay sai, tuy nhiên tôi cần phải làm điều đó chính xác tương tự ngoại trừ để tìm nếu một giá trị tồn tại.

Câu trả lời:


381
>>> d = {'1': 'one', '3': 'three', '2': 'two', '5': 'five', '4': 'four'}
>>> 'one' in d.values()
True

Vì tò mò, một số thời gian so sánh:

>>> T(lambda : 'one' in d.itervalues()).repeat()
[0.28107285499572754, 0.29107213020324707, 0.27941107749938965]
>>> T(lambda : 'one' in d.values()).repeat()
[0.38303399085998535, 0.37257885932922363, 0.37096405029296875]
>>> T(lambda : 'one' in d.viewvalues()).repeat()
[0.32004380226135254, 0.31716084480285645, 0.3171098232269287]

EDIT: Và trong trường hợp bạn tự hỏi tại sao ... lý do là mỗi điều trên trả về một loại đối tượng khác nhau, có thể hoặc không phù hợp với hoạt động tra cứu:

>>> type(d.viewvalues())
<type 'dict_values'>
>>> type(d.values())
<type 'list'>
>>> type(d.itervalues())
<type 'dictionary-valueiterator'>

EDIT2: Theo yêu cầu trong bình luận ...

>>> T(lambda : 'four' in d.itervalues()).repeat()
[0.41178202629089355, 0.3959040641784668, 0.3970959186553955]
>>> T(lambda : 'four' in d.values()).repeat()
[0.4631338119506836, 0.43541407585144043, 0.4359898567199707]
>>> T(lambda : 'four' in d.viewvalues()).repeat()
[0.43414998054504395, 0.4213531017303467, 0.41684913635253906]

Tôi không có con trăn nào trong tay, bạn có thể chạy lại các bài kiểm tra với 'bốn' thay vì 'một' không?
soulcheck

2
Rốt cuộc nó không phải là hạt giống, trừ khi chạy trên dict lớn hơn. Tôi đoán chi phí hoạt động trong các giá trị () là do sao chép danh sách giá trị và trong giá trị khung nhìn () bằng cách duy trì chế độ xem còn sống.
soulcheck

Với kích thước nhỏ d, thời gian là vô nghĩa. Trong Python 3, dict.values()theo mặc định, một chế độ xem từ điển dict.itervalues()dict.viewvalues()đã biến mất. Bạn có thể kiểm tra lại điều này (với một từ điển lớn hơn) và sử dụng list(d.values())để có hành vi Python 2 và iter(d.values())để thực hiện dict.itervalues()hành vi, nhưng vì cả hai phiên bản này đều yêu cầu tra cứu và gọi toàn cầu, chúng sẽ hoàn toàn chậm hơn. Cả hai đều làm thêm mà không cần thiết.
Martijn Pieters

33

Bạn có thể dùng

"one" in d.itervalues()

để kiểm tra nếu "one"là một trong các giá trị của từ điển của bạn.


23

Từ điển Python có funcion (key)

>>> d.get(key)

Ví dụ,

>>> d = {'1': 'one', '3': 'three', '2': 'two', '5': 'five', '4': 'four'}
>>> d.get('3')
'three'
>>> d.get('10')
none

Nếu khóa của bạn không tồn tại, sẽ trả về nonegiá trị.

foo = d[key] # raise error if key doesn't exist
foo = d.get(key) # return none if key doesn't exist

Nội dung liên quan đến các phiên bản nhỏ hơn 3.0 và lớn hơn 5.0. .


29
Không trả lời câu hỏi. OP đã hỏi về một giá trị như trong key:valuevà không phải là chính.
akshaynagpal


4

Các loại khác nhau để kiểm tra các giá trị tồn tại

d = {"key1":"value1", "key2":"value2"}
"value10" in d.values() 
>> False

Nếu danh sách các giá trị thì sao

test = {'key1': ['value4', 'value5', 'value6'], 'key2': ['value9'], 'key3': ['value6']}
"value4" in [x for v in test.values() for x in v]
>>True

Điều gì xảy ra nếu danh sách các giá trị với các giá trị chuỗi

test = {'key1': ['value4', 'value5', 'value6'], 'key2': ['value9'], 'key3': ['value6'], 'key5':'value10'}
values = test.values()
"value10" in [x for v in test.values() for x in v] or 'value10' in values
>>True

Không sử dụng value in [... list comprehension over sequence ...], sử dụng any(value in sequence ...), để tránh tạo một đối tượng danh sách mà bạn không sử dụng cho bất kỳ điều gì khác và để đoản mạch khi tìm thấy giá trị.
Martijn Pieters

0

Trong Python 3, bạn có thể sử dụng values()chức năng của từ điển. Nó trả về một đối tượng xem của các giá trị. Điều này, đến lượt nó, có thể được truyền cho iterhàm trả về một đối tượng lặp. Trình lặp có thể được kiểm tra bằng cách sử dụng in, như thế này,

'one' in iter(d.values())

Hoặc bạn có thể sử dụng đối tượng xem trực tiếp vì nó tương tự như một danh sách

'one' in d.values()

1
Không có điểm nào trong việc sử dụng iter()trên một cái nhìn từ điển; insẽ sử dụng đối tượng như một lần lặp (loại không triển khai chuyên dụng__contains__ phương thức ). Sự khác biệt duy nhất giữa 'one' in iter(d.values())'one in d.values()là bạn đã khiến Python thực hiện thêm công việc (trả chi phí tìm kiếm toàn cầu iter).
Martijn Pieters
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.