Хорошо, не уверен, как объяснить эту проблему, но здесь идет.

Это мой словарь myDictionary = {'12/2019' : [{'1003' : 2}, {'1040' : 3}]}

Я пытаюсь перечислить '1003', '1040'.

Я пытался использовать этот метод:

for i in range(len(a['12/2019'])):
    print(a['12/2019'][i].keys())

Это работает, но возвращает меня

dict_keys(['1003'])
dict_keys(['1040'])

Могу ли я в любом случае просто получить 1030 и 1040 для изоляции от ... dict_keys ([''])?

1
Denise 25 Июн 2019 в 19:46

5 ответов

Лучший ответ

Вы можете перебирать значения словаря, а если это список, перебирать словари в списке и добавлять все ключи к результату.

myDictionary = {'12/2019' : [{'1003' : 2}, {'1040' : 3}],
                '11/2019': '1005', '10/2019': 1234,
                '09/2019': [{'1006' : 2}, {'1042' : 3}],
                '08/2019': (1,2)}

keys=[]

#Iterate over values 
for value in myDictionary.values():

    #If value is a list
    if isinstance(value, list):

        #Iterate over the list
        for d in value:

            #Add the keys to the result
            keys.extend(list(d.keys()))

print(keys)

Выход будет

['1003', '1040', '1006', '1042']

Вы также можете сделать это через понимание списка, но это не совсем читабельно, поэтому я бы избегал этого

[key for value in myDictionary.values() if isinstance(value, list) for d in value for key in d.keys()]
1
Devesh Kumar Singh 25 Июн 2019 в 16:57

Это может быть больше, чем вам нужно, но если данные, которыми вы поделились для примера, являются лишь небольшим подмножеством того, что вы действительно просматриваете, вот рекурсивная функция, которая может пойти настолько глубоко, насколько вы захотите.

Поскольку вы, кажется, хотите пропустить клавиши на самом внешнем уровне, я поставил точку, чтобы позволить вам пропустить клавиши на заданной глубине. Вы не должны устанавливать аргумент уровня вручную, так как код просто обновит его для себя.

def list_keys(element, ignore_levels=[], level=1):
    """
    Recursivly list keys found in an element.

    element: item to inspect.
    ignore_levels: list of numeric levels to ignore.
    level: recursion depth level.
    """
    keys = []

    # add keys if we're not ignoring this level and set iterable to values
    if isinstance(element, dict):
        if level not in ignore_levels:
            keys.extend(element.keys())
        iterable = element.values()

    # if we hve a list or tuple, we can iterate over it
    elif isinstance(element, (list, tuple)):
        iterable = element

    # if we have a single value, it's not a key and there's nothing to iterate
    else:
        iterable = []

    # Iterate over elements and append any keys found
    for i in iterable:
        subkeys = list_keys(i, ignore_levels, level + 1)
        if subkeys:
            keys.extend(subkeys)

    return keys

d = {'12/2019': [{'1003': 2}, {'1040': 3}]}
print(list_keys(d, ignore_levels=[1]))
# ['1003', '1040']
1
Cohan 25 Июн 2019 в 17:11

Перебирайте субдикты в списке, захватывая ключи:

for sub_dict in a['12/2019']:
   for key, val in sub_dict.items():
        print(key)
1
Prune 25 Июн 2019 в 16:54

Вы можете использовать список-понимание:

[k for v in myDictionary.values() for x in v for k in x]

В коде :

myDictionary = {'12/2019' : [{'1003' : 2}, {'1040' : 3}]}

print([k for v in myDictionary.values() for x in v for k in x])
# ['1003', '1040']
1
Austin 25 Июн 2019 в 16:54

Вы можете сделать это, сделав что-то вроде этого

data = {'12/2019' : [{'1003' : 2}, {'1040' : 3}]}
# Data is a dictionary of where each value corresponding
# to the key is a list of dictionaries.

for k, v in data.items():
    # v is a list of dictionaries
    all_keys = []
    for value in v:
        all_keys.extend(list(value.keys()))
    print (all_keys)

Результат ['1003', '1040']

1
Sudheesh Singanamalla 25 Июн 2019 в 16:55