tra-loi-cau-hoi-phat-trien-web.com

Kiểm tra xem một khóa đã cho đã tồn tại trong từ điển chưa

Tôi muốn kiểm tra xem một khóa có tồn tại trong từ điển hay không trước khi cập nhật giá trị cho khóa . Tôi đã viết đoạn mã sau:

if 'key1' in dict.keys():
  print "blah"
else:
  print "boo"

Tôi nghĩ rằng đây không phải là cách tốt nhất để hoàn thành nhiệm vụ này. Có cách nào tốt hơn để kiểm tra khóa trong từ điển không?

2521
Mohan Gulati

in là cách dự định để kiểm tra sự tồn tại của khóa trong dict.

d = dict()

for i in xrange(100):
    key = i % 10
    if key in d:
        d[key] += 1
    else:
        d[key] = 1

Nếu bạn muốn mặc định, bạn luôn có thể sử dụng dict.get():

d = dict()

for i in xrange(100):
    key = i % 10
    d[key] = d.get(key, 0) + 1

... và nếu bạn muốn luôn đảm bảo giá trị mặc định cho bất kỳ khóa nào, bạn có thể sử dụng defaultdict từ mô đun collections, như vậy:

from collections import defaultdict

d = defaultdict(lambda: 0)

for i in xrange(100):
    d[i % 10] += 1

... nhưng nói chung, từ khóa in là cách tốt nhất để làm điều đó.

2587
Chris B.

Bạn không phải gọi phím:

if 'key1' in dict:
  print "blah"
else:
  print "boo"

Điều đó sẽ nhanh hơn nhanh hơn vì nó sử dụng tính năng băm của từ điển trái ngược với thực hiện tìm kiếm tuyến tính, điều mà các phím gọi sẽ làm.

1257
Jason Baker

Bạn có thể kiểm tra sự hiện diện của khóa trong từ điển bằng cách sử dụng trong từ khóa:

d = {'a': 1, 'b': 2}
'a' in d # <== evaluates to True
'c' in d # <== evaluates to False

Một cách sử dụng phổ biến để kiểm tra sự tồn tại của khóa trong từ điển trước khi thay đổi nó là để khởi tạo mặc định giá trị (ví dụ: nếu giá trị của bạn là danh sách, và bạn muốn đảm bảo rằng có một danh sách trống mà bạn có thể nối vào khi chèn giá trị đầu tiên cho khóa). Trong những trường hợp như vậy, bạn có thể thấy loại collections.defaultdict() được quan tâm.

Trong mã cũ hơn, bạn cũng có thể tìm thấy một số cách sử dụng has_key(), một phương pháp không dùng nữa để kiểm tra sự tồn tại của các khóa trong từ điển (thay vào đó chỉ sử dụng key_name in dict_name).

240
Michael Aaron Safyan

Bạn có thể rút ngắn điều này:

if 'key1' in dict:
    ...

Tuy nhiên, đây là tốt nhất một cải tiến mỹ phẩm. Tại sao bạn tin rằng đây không phải là cách tốt nhất?

82
Greg Hewgill

Tôi sẽ khuyên bạn nên sử dụng phương thức setdefault thay thế. Có vẻ như nó sẽ làm mọi thứ bạn muốn.

>>> d = {'foo':'bar'}
>>> q = d.setdefault('foo','baz') #Do not override the existing key
>>> print q #The value takes what was originally in the dictionary
bar
>>> print d
{'foo': 'bar'}
>>> r = d.setdefault('baz',18) #baz was never in the dictionary
>>> print r #Now r has the value supplied above
18
>>> print d #The dictionary's been updated
{'foo': 'bar', 'baz': 18}
44
David Berger

Để biết thêm thông tin về việc thực hiện tốc độ của các phương pháp được đề xuất của câu trả lời được chấp nhận (vòng lặp 10m):

  • 'key' in mydict thời gian trôi qua 1.07 giây
  • mydict.get('key') thời gian trôi qua 1,84 giây
  • mydefaultdict['key'] thời gian trôi qua 1.07 giây

Do đó, sử dụng in hoặc defaultdict được khuyến nghị chống lại get.

40
Wtower

Từ điển trong python có phương thức get ('key', default). Vì vậy, bạn chỉ có thể đặt một giá trị mặc định trong trường hợp không có khóa. 

values = {...}
myValue = values.get('Key', None)
39
mafonya

Điều gì về việc sử dụng EAFP (dễ xin tha thứ hơn là cho phép):

try:
   blah = dict["mykey"]
   # key exists in dict
except KeyError:
   # key doesn't exist in dict

Xem các bài đăng SO khác:

Sử dụng thử vs nếu trong python hoặc

Kiểm tra sự tồn tại của thành viên trong Python

24
HungryArthur

Sử dụng toán tử ternary:

message = "blah" if 'key1' in dict else "booh"
print(message)
21
Charitoo

Để kiểm tra, bạn có thể sử dụng phương thức has_key() 

if dict.has_key('key1'):
   print "it is there"

Nếu bạn muốn có một giá trị thì bạn có thể sử dụng phương thức get()

a = dict.get('key1', expeced_type)

Nếu bạn muốn một Tuple hoặc danh sách hoặc từ điển hoặc bất kỳ chuỗi nào làm giá trị mặc định làm giá trị trả về, thì hãy sử dụng phương thức get()

a = dict.get('key1', {}).get('key2', [])
18
Debabrata

Những cách mà bạn có thể nhận được kết quả là:

Cái nào tốt hơn là phụ thuộc vào 3 điều:

  1. Liệu từ điển 'thường có khóa' hay 'thông thường không có khóa'.
  2. Bạn có định sử dụng các điều kiện như nếu ... khác ... khác ... khác không?
  3. Từ điển lớn như thế nào?

Đọc thêm: http://paltman.com/try-except-performance-in-python-a-simple-test/

Sử dụng thử/chặn thay vì 'trong' hoặc 'nếu':

try:
    my_dict_of_items[key_i_want_to_check]
except KeyError:
    # Do the operation you wanted to do for "key not present in dict".
else:
    # Do the operation you wanted to do with "key present in dict."
15
Bishwas Mishra

Chỉ là một FYI thêm vào Chris. B (câu trả lời hay nhất):

d = defaultdict(int)

Hoạt động tốt; lý do là việc gọi int() trả về 0, đó là những gì defaultdict thực hiện phía sau hậu trường (khi xây dựng từ điển), do đó có tên "Chức năng của nhà máy" trong tài liệu.

14
Mauricio Morales

Bạn có thể sử dụng phương thức has_key ():

if dict.has_key('xyz')==1:
    #update the value for the key
else:
    pass

Hoặc phương thức dict.get để đặt giá trị mặc định nếu không tìm thấy:

mydict = {"a": 5}

print mydict["a"]            #prints 5
print mydict["b"]            #Throws KeyError: 'b'

print mydict.get("a", 0)     #prints 5
print mydict.get("b", 0)     #prints 0
12
wan kenobi

print dict.get('key1', 'blah')

Không in boo cho các giá trị trong dict, nhưng hoàn thành mục tiêu bằng cách in giá trị của key1 để xác nhận sự tồn tại của nó thay vào đó.

7
gounc86

Từ điển Python có phương thức gọi là __contains__. Phương thức này sẽ trả về True nếu từ điển có khóa khác trả về Sai.

 >>> temp = {}

 >>> help(temp.__contains__)

Help on built-in function __contains__:

__contains__(key, /) method of builtins.dict instance
    True if D has a key k, else False.
5
Siva Gnanam

Để kiểm tra xem khóa đã cho có tồn tại trong từ điển hay không, bạn nên sử dụng bất kỳ phương pháp nào sau đây:

Cách tiếp cận Một (làm việc trong Python 3):

def checkKey(dict, key):    
    if key in dict.keys(): 
        print("Key is here, ", end =" ") 
        print("value =", dict[key]) 
    else: 
        print("Key isn't present.") 

Hãy kiểm tra xem:

dict = {'r': 30, 'g':59, 'b':11} 

key = 'b'
checkKey(dict, key) 

key = 'a'
checkKey(dict, key) 

Kết quả của Approach One:

# Key is here, value = 11
# Key isn't present.

Cách tiếp cận Hai (làm việc trong Python 3):

def checkKey(dict, key):   
    if key in dict: 
        print("Key is here, ", end =" ") 
        print("value =", dict[key]) 
    else: 
        print("Key isn't present.") 

Hãy cũng kiểm tra xem: 

dict = {'x': 10, 'y':20, 'z':30} 

key = 'y'
checkKey(dict, key) 

key = 'u'
checkKey(dict, key) 

Kết quả của Approach Two:

# Key is here, value = 20
# Key isn't present.

Cách tiếp cận Ba (làm việc trong Python 3):

def checkKey(dict, key):      
    if dict.has_key(key): 
        print "Key is here, value =", dict[key] 
    else: 
        print "Key isn't present."

Hãy cũng kiểm tra xem:

dict = {'u': 0, 'v':1, 'w':2} 

key = 'u'
checkKey(dict, key) 

key = 'm'
checkKey(dict, key)

Kết quả của Approach Three:

# Key is here, value = 0
# Key isn't present.

Hi vọng điêu nay co ich.

4
ARGeo

Chia sẻ thêm một cách kiểm tra nếu một khóa tồn tại bằng cách sử dụng các toán tử boolean.

d = {'a': 1, 'b':2}
keys = 'abcd'

for k in keys:
    x = (k in d and 'blah') or 'boo'
    print(x) 

Điều này trở lại

>>> blah
>>> blah
>>> boo
>>> boo

Giải trình

Trước tiên, bạn nên biết rằng trong Python, 0, None hoặc các đối tượng có độ dài bằng 0 đánh giá thành False. Mọi thứ khác đánh giá là True. Các phép toán Boolean được đánh giá từ trái sang phải và trả về toán hạng không đúng hoặc sai.

Hãy xem một ví dụ:

>>> 'Some string' or 1/0 
'Some string'
>>>

'Some string' ước tính thành True, phần còn lại của or không được đánh giá và không có sự phân chia nào cho lỗi không được nêu ra.

Nhưng nếu chúng tôi chuyển đổi thứ tự 1/0 được đánh giá đầu tiên và đưa ra một ngoại lệ:

>>> 1/0 or 'Some string'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>> 

Chúng ta có thể sử dụng điều này cho mẫu để kiểm tra nếu một khóa tồn tại.

(k in d and 'blah')

làm giống như

if k in d:
    'blah'
else:
    False

Điều này đã trả về kết quả chính xác nếu khóa tồn tại, nhưng chúng tôi muốn nó in 'boo' khi không có. Vì vậy, chúng tôi lấy kết quả và or với 'boo'

>>> False or 'boo'
'boo'
>>> 'blah' or 'boo'
'blah'
>>> 
3
J. Antunes

Chà .. Bạn sẽ quen với việc tìm kiếm sự tồn tại của một thành phần trong danh sách hoặc dữ liệu có nghĩa là trải qua mọi thứ (ít nhất là đối với danh sách không có thứ tự, ví dụ dict.keys).

d={1:'a',2:'b'}
try:
    needed=d[3]
    print(needed)
except:
    print("Key doesnt exist")
3
Seenivasan

Dễ nhất là nếu bạn biết khóa nào (tên khóa) cần tìm:

# suppose your dictionary is
my_dict = {'foo': 1, 'bar': 2}
# check if a key is there
if 'key' in my_dict.keys():   # it will evaluates to true if that key is present otherwise false.
    # do something

hoặc bạn cũng có thể làm đơn giản như:

if 'key' in my_dict:   # it will evaluates to true if that key is present otherwise false.
    # do something
1
Tasneem Haider

Tôi sử dụng thử/ngoại trừ ; nếu một ngoại lệ được ném, hơn khóa không có trong từ điển .

st = 'sdhfjaks'
d = {}
try:
    print d['st']
except Exception, e:
    print 'Key not in the dictionary'
1
Leonardo Maffei

Kiểm tra xem một khóa đã cho đã tồn tại trong từ điển chưa

Để có được ý tưởng làm thế nào, trước tiên chúng ta kiểm tra những phương thức nào chúng ta có thể gọi trong từ điển. Dưới đây là các phương pháp:

d={'clear':0, 'copy':1, 'fromkeys':2, 'get':3, 'items':4, 'keys':5, 'pop':6, 'popitem':7, 'setdefault':8, 'update':9, 'values':10}

Python Dictionary clear()       Removes all Items
Python Dictionary copy()        Returns Shallow Copy of a Dictionary
Python Dictionary fromkeys()    Creates dictionary from given sequence
Python Dictionary get()         Returns Value of The Key
Python Dictionary items()       Returns view of dictionary (key, value) pair
Python Dictionary keys()        Returns View Object of All Keys
Python Dictionary pop()         Removes and returns element having given key
Python Dictionary popitem()     Returns & Removes Element From Dictionary
Python Dictionary setdefault()  Inserts Key With a Value if Key is not Present
Python Dictionary update()      Updates the Dictionary 
Python Dictionary values()      Returns view of all values in dictionary

Phương thức tàn bạo để kiểm tra xem khóa đã tồn tại có thể là phương thức get():

d.get("key")

Hai thú vị phương thức items()keys() nghe có vẻ như quá nhiều công việc. Vì vậy, hãy kiểm tra xem get() có phải là phương pháp phù hợp với chúng ta không. Chúng tôi có chính tả của mình d:

d= {'clear':0, 'copy':1, 'fromkeys':2, 'get':3, 'items':4, 'keys':5, 'pop':6, 'popitem':7, 'setdefault':8, 'update':9, 'values':10}

In ấn cho thấy khóa chúng tôi không có sẽ trả về None:

print(d.get('key')) #None
print(d.get('clear')) #0
print(d.get('copy')) #1

Chúng tôi có thể sử dụng thông tin đó để lấy thông tin nếu khóa có hoặc không. Nhưng hãy xem xét điều này nếu chúng ta tạo một lệnh với một key:None:

d= {'key':None}
print(d.get('key')) #None
print(d.get('key2')) #None

Dẫn đến phương thức get() không đáng tin cậy trong trường hợp một số giá trị có thể là None. Câu chuyện này nên có một kết thúc hạnh phúc hơn. Nếu chúng ta sử dụng bộ so sánh in:

print('key' in d) #True
print('key2' in d) #False

Chúng tôi nhận được kết quả chính xác. Chúng tôi có thể kiểm tra mã byte Python:

import dis
dis.dis("'key' in d")
#   1           0 LOAD_CONST               0 ('key')
#               2 LOAD_NAME                0 (d)
#               4 COMPARE_OP               6 (in)
#               6 RETURN_VALUE

dis.dis("d.get('key2')")
#   1           0 LOAD_NAME                0 (d)
#               2 LOAD_METHOD              1 (get)
#               4 LOAD_CONST               0 ('key2')
#               6 CALL_METHOD              1
#               8 RETURN_VALUE

Điều này cho thấy toán tử so sánh in không chỉ đáng tin cậy hơn mà thậm chí còn nhanh hơn get().

1
prosti

Bạn có thể sử dụng vòng lặp for để đi vào từng thành phần vào từ điển và lấy tên bạn muốn tìm trong từ điển, sau đó kiểm tra xem nó có tồn tại hay không như thế: 

dic={‘first’ : 12, ‘second’ : 123}
For each in dic :
If each == ‘second’: 
    Print (‘it is exist’)
else :
     print (‘not exist’)
0
Abdulkalek