Hướng dẫn check if key exists in nested dictionary python - kiểm tra xem khóa có tồn tại trong python từ điển lồng nhau không

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:

  1. Sử dụng 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 để lấy mỗi khóa.
  2. 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.
  3. Bạn có thể chuỗi càng nhiều cuộc gọi đế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 khi cần thiết.

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:

TênSự mô tả
Chìa khóaKhóa để trả về giá trị
mặc địnhGiá 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

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ì 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.

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.

Bài Viết Liên Quan

Chủ Đề