Câu trả lời được chọn hoạt động tốt trên con đường hạnh phúc, nhưng có một vài vấn đề rõ ràng với tôi. Nếu bạn đã tìm kiếm ["Spam", "Egg", "Bacon", "Pizza"], nó sẽ gây ra lỗi loại do cố gắng lập chỉ mục "..." sử dụng chuỗi "pizza". Giống như khôn ngoan, nếu bạn thay thế pizza bằng 2, nó sẽ sử dụng nó để lấy chỉ số 2 từ "tốt ..."
Các vấn đề đầu ra câu trả lời được chọn::
data = {
"spam": {
"egg": {
"bacon": "Well..",
"sausages": "Spam egg sausages and spam",
"spam": "does not have much spam in it"
}
}
}
print[keys_exists[data, "spam", "egg", "bacon", "pizza"]]
>> TypeError: string indices must be integers
print[keys_exists[data, "spam", "egg", "bacon", 2]]]
>> l
Tôi cũng cảm thấy rằng sử dụng thử ngoại trừ có thể là một cái nạng mà chúng ta có thể quá nhanh dựa vào. Vì tôi tin rằng chúng tôi đã cần kiểm tra loại, cũng có thể loại bỏ thử ngoại trừ.
Solution:
def dict_value_or_default[element, keys=[], default=Undefined]:
'''
Check if keys [nested] exists in `element` [dict].
Returns value if last key exists, else returns default value
'''
if not isinstance[element, dict]:
return default
_element = element
for key in keys:
# Necessary to ensure _element is not a different indexable type [list, string, etc].
# get[] would have the same issue if that method name was implemented by a different object
if not isinstance[_element, dict] or key not in _element:
return default
_element = _element[key]
return _element
Output:
print[dict_value_or_default[data, ["spam", "egg", "bacon", "pizza"]]]
>> INVALID
print[dict_value_or_default[data, ["spam", "egg", "bacon", 2]]]
>> INVALID
print[dict_value_or_default[data, ["spam", "egg", "bacon"]]]
>> "Well..."
Kiểm tra xem một khóa lồng nhau có tồn tại trong một từ điển trong Python # không
Sử dụng câu lệnh try/except
để kiểm tra xem khóa lồng nhau có tồn tại trong từ điển không. Nếu một hoặc nhiều khóa lồng nhau không tồn tại, KeyError
sẽ được nâng lên và sau đó được xử lý bởi khối ____10.
Copied!
my_dict = { 'address': { 'country': 'Finland', 'city': 'Oulu' } } try: city = my_dict['address']['city'] print[city] # 👉️ Oulu except KeyError: print['The specified key does NOT exist'] # ------------------------------------------------- try: result = my_dict['not']['found']['key'] except KeyError: # 👇️ this runs print['The specified key does NOT exist']
Chúng tôi cố gắng truy cập khóa lồng nhau trong khối
def dict_value_or_default[element, keys=[], default=Undefined]:
'''
Check if keys [nested] exists in `element` [dict].
Returns value if last key exists, else returns default value
'''
if not isinstance[element, dict]:
return default
_element = element
for key in keys:
# Necessary to ensure _element is not a different indexable type [list, string, etc].
# get[] would have the same issue if that method name was implemented by a different object
if not isinstance[_element, dict] or key not in _element:
return default
_element = _element[key]
return _element
1 của câu lệnh try/except
.Nếu một trong các phím không tồn tại, ngoại lệ KeyError
sẽ được nâng lên và sau đó được xử lý bởi khối ____10.
Bạn có thể sử dụng câu lệnh
def dict_value_or_default[element, keys=[], default=Undefined]:
'''
Check if keys [nested] exists in `element` [dict].
Returns value if last key exists, else returns default value
'''
if not isinstance[element, dict]:
return default
_element = element
for key in keys:
# Necessary to ensure _element is not a different indexable type [list, string, etc].
# get[] would have the same issue if that method name was implemented by a different object
if not isinstance[_element, dict] or key not in _element:
return default
_element = _element[key]
return _element
5 nếu bạn cần bỏ qua ngoại lệ.Copied!
my_dict = { 'address': { 'country': 'Finland', 'city': 'Oulu' } } try: result = my_dict['not']['found']['key'] except KeyError: pass
Câu lệnh PASS không làm gì và được sử dụng khi bắt buộc phải có câu lệnh nhưng chương trình không yêu cầu hành động.
Nếu bạn phải làm điều này thường xuyên, hãy trích xuất logic vào một hàm có thể tái sử dụng.
Copied!
def keys_exists[dictionary, keys]: nested_dict = dictionary for key in keys: try: nested_dict = nested_dict[key] except KeyError: return False return True my_dict = { 'address': { 'country': 'Finland', 'city': 'Oulu' } } # 👇️ True print[ keys_exists[my_dict, ['address', 'city']] ] # 👇️ False print[ keys_exists[my_dict, ['key', 'not', 'found']] ]
Hàm lấy một từ điển và một danh sách các khóa và kiểm tra xem chuỗi các khóa có tồn tại trong từ điển không.
Chúng tôi lặp lại danh sách các khóa và cố gắng truy cập từng khóa lồng nhau, vì vậy thứ tự của các khóa trong danh sách là quan trọng.
Hàm trả về
def dict_value_or_default[element, keys=[], default=Undefined]:
'''
Check if keys [nested] exists in `element` [dict].
Returns value if last key exists, else returns default value
'''
if not isinstance[element, dict]:
return default
_element = element
for key in keys:
# Necessary to ensure _element is not a different indexable type [list, string, etc].
# get[] would have the same issue if that method name was implemented by a different object
if not isinstance[_element, dict] or key not in _element:
return default
_element = _element[key]
return _element
6 Nếu chuỗi các khóa tồn tại trong từ điển, nếu không def dict_value_or_default[element, keys=[], default=Undefined]:
'''
Check if keys [nested] exists in `element` [dict].
Returns value if last key exists, else returns default value
'''
if not isinstance[element, dict]:
return default
_element = element
for key in keys:
# Necessary to ensure _element is not a different indexable type [list, string, etc].
# get[] would have the same issue if that method name was implemented by a different object
if not isinstance[_element, dict] or key not in _element:
return default
_element = _element[key]
return _element
7 được trả về.Ngoài ra, bạn có thể sử dụng phương pháp
def dict_value_or_default[element, keys=[], default=Undefined]:
'''
Check if keys [nested] exists in `element` [dict].
Returns value if last key exists, else returns default value
'''
if not isinstance[element, dict]:
return default
_element = element
for key in keys:
# Necessary to ensure _element is not a different indexable type [list, string, etc].
# get[] would have the same issue if that method name was implemented by a different object
if not isinstance[_element, dict] or key not in _element:
return default
_element = _element[key]
return _element
8.Kiểm tra xem khóa lồng nhau có tồn tại trong từ điển bằng dict.get [] #
Để kiểm tra xem một khóa lồng nhau có tồn tại trong từ điển không:
- Sử dụng phương thức
8 để lấy mỗi khóa.def dict_value_or_default[element, keys=[], default=Undefined]: ''' Check if keys [nested] exists in `element` [dict]. Returns value if last key exists, else returns default value ''' if not isinstance[element, dict]: return default _element = element for key in keys: # Necessary to ensure _element is not a different indexable type [list, string, etc]. # get[] would have the same issue if that method name was implemented by a different object if not isinstance[_element, dict] or key not in _element: return default _element = _element[key] return _element
- Chỉ định một từ điển trống là giá trị mặc định nếu khóa không tồn tại.
- Bạn có thể chuỗi càng nhiều cuộc gọi đến phương thức
8 khi cần thiết.def dict_value_or_default[element, keys=[], default=Undefined]: ''' Check if keys [nested] exists in `element` [dict]. Returns value if last key exists, else returns default value ''' if not isinstance[element, dict]: return default _element = element for key in keys: # Necessary to ensure _element is not a different indexable type [list, string, etc]. # get[] would have the same issue if that method name was implemented by a different object if not isinstance[_element, dict] or key not in _element: return default _element = _element[key] return _element
Copied!
my_dict = { 'address': { 'country': 'Finland', 'city': 'Oulu' } } result = my_dict.get['address', {}].get['city'] print[result] # 👉️ Oulu result = my_dict.get['key', {}].get['not', {}].get['found'] print[result] # 👉️ None
Phương thức Dict.get trả về giá trị cho khóa đã cho nếu khóa nằm trong từ điển, nếu không, giá trị mặc định được trả về.
Phương thức lấy 2 tham số sau:
Chìa khóa | Khóa để trả về giá trị |
mặc định | Giá trị mặc định được trả về nếu khóa được cung cấp không có trong từ điển [tùy chọn] |
Nếu một giá trị cho tham số
print[dict_value_or_default[data, ["spam", "egg", "bacon", "pizza"]]]
>> INVALID
print[dict_value_or_default[data, ["spam", "egg", "bacon", 2]]]
>> INVALID
print[dict_value_or_default[data, ["spam", "egg", "bacon"]]]
>> "Well..."
1 không được cung cấp, nó mặc định là print[dict_value_or_default[data, ["spam", "egg", "bacon", "pizza"]]]
>> INVALID
print[dict_value_or_default[data, ["spam", "egg", "bacon", 2]]]
>> INVALID
print[dict_value_or_default[data, ["spam", "egg", "bacon"]]]
>> "Well..."
2, do đó phương thức print[dict_value_or_default[data, ["spam", "egg", "bacon", "pizza"]]]
>> INVALID
print[dict_value_or_default[data, ["spam", "egg", "bacon", 2]]]
>> INVALID
print[dict_value_or_default[data, ["spam", "egg", "bacon"]]]
>> "Well..."
3 không bao giờ tăng KeyError
.Chúng tôi đã chuyển một từ điển trống làm đối số thứ hai cho phương thức
8, vì vậy chúng tôi có thể chuỗi nhiều cuộc gọi đến phương thức ngay cả khi khóa lồng nhau không tồn tại.def dict_value_or_default[element, keys=[], default=Undefined]:
'''
Check if keys [nested] exists in `element` [dict].
Returns value if last key exists, else returns default value
'''
if not isinstance[element, dict]:
return default
_element = element
for key in keys:
# Necessary to ensure _element is not a different indexable type [list, string, etc].
# get[] would have the same issue if that method name was implemented by a different object
if not isinstance[_element, dict] or key not in _element:
return default
_element = _element[key]
return _element
Nếu khóa được chỉ định không tồn tại, một từ điển trống sẽ được trả về trên đó chúng ta có thể gọi một cách an toàn phương thức
def dict_value_or_default[element, keys=[], default=Undefined]:
'''
Check if keys [nested] exists in `element` [dict].
Returns value if last key exists, else returns default value
'''
if not isinstance[element, dict]:
return default
_element = element
for key in keys:
# Necessary to ensure _element is not a different indexable type [list, string, etc].
# get[] would have the same issue if that method name was implemented by a different object
if not isinstance[_element, dict] or key not in _element:
return default
_element = _element[key]
return _element
8.Bạn không phải chuyển một từ điển trống trong cuộc gọi cuối cùng đến
def dict_value_or_default[element, keys=[], default=Undefined]:
'''
Check if keys [nested] exists in `element` [dict].
Returns value if last key exists, else returns default value
'''
if not isinstance[element, dict]:
return default
_element = element
for key in keys:
# Necessary to ensure _element is not a different indexable type [list, string, etc].
# get[] would have the same issue if that method name was implemented by a different object
if not isinstance[_element, dict] or key not in _element:
return default
_element = _element[key]
return _element
8 vì phương thức trả về print[dict_value_or_default[data, ["spam", "egg", "bacon", "pizza"]]]
>> INVALID
print[dict_value_or_default[data, ["spam", "egg", "bacon", 2]]]
>> INVALID
print[dict_value_or_default[data, ["spam", "egg", "bacon"]]]
>> "Well..."
2 nếu giá trị mặc định không được cung cấp và khóa không tồn tại.Copied!
my_dict = { 'address': { 'country': 'Finland', 'city': 'Oulu' } } result = my_dict.get['key', {}].get['not', {}].get['found'] print[result] # 👉️ None
Cách tiếp cận mà bạn chọn là một vấn đề sở thích cá nhân. Tôi sẽ sử dụng một câu lệnh try/except
vì tôi thấy chúng khá trực tiếp và dễ đọc.