exhalace
@exhalace
Системный администратор

Как вывести список из элементов списка словарей по указанному ключу?

Имеем следующую структуру:
data = {
    "some_list": [
        {"key1": "some_value1", "key2", "some_value2" },
        {"key1": "some_value1", "key2", "some_value2" },
        {"key1": "some_value1", "key2", "some_value2" },
        {"key1": "some_value1", "key2", "some_value2" },
    ]
}

Необходимо получать данные из структуры, передавая в качестве аргумента строку, которая представляет собой перечисленные ключи или индексы в порядке вложенности.
В первом случае на входе имеем в качестве аргумента строку:
s1 = "some_list.*.key1"
Во втором случае имеем в качестве аргумента строку:
s2 = "some_list.0.key1"
В первом случае результатом должен быть список из значений словарей с ключом key1.
Во втором случае просто одно значение.

Второй случай я решил следующим образом:
def get_val(data, field):
    field = field.split(".")
    eval_string = "data"
    for f in field:
        if f.isdigit():
            eval_string += "[{}]".format(f)
        else:
            eval_string += "['{}'}".format(f)
    return eval(eval_string)

result = get_val(data, s2)
print(result)
# som_value1


Как переписать функцию get_val так, чтобы при указании звездочки вместо индекса, выводился список?
  • Вопрос задан
  • 321 просмотр
Пригласить эксперта
Ответы на вопрос 2
AnnTHony
@AnnTHony
Интроверт
def get_val(data, query):
    main_key, index, sub_key = query.split('.')

    if index == '*':
        return [item[sub_key] for item in data[main_key]]
    else:
        return data[main_key][int(index)][sub_key]


data = {
    "some_list": [
        {"key1": "some_value1", "key2": "some_value2" },
        {"key1": "some_value1", "key2": "some_value2" },
        {"key1": "some_value1", "key2": "some_value2" },
        {"key1": "some_value1", "key2": "some_value2" },
    ]
}

print(get_val(data, 'some_list.*.key1'))
print(get_val(data, 'some_list.0.key1'))
Ответ написан
Комментировать
@anerev
if s1.split('.')[1] == '*':
    list1 = [keys[s1.split('.')[-1]] for keys in data[s1.split('.')[0]]]
    print(list1)
else:
    print(data[s1.split('.')[0]][int(s1.split('.')[1])][s1.split('.')[2]])
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
22 нояб. 2024, в 03:54
1500 руб./за проект
22 нояб. 2024, в 02:56
10000 руб./за проект
22 нояб. 2024, в 00:55
500 руб./за проект