Попытка получить dict[k] из dict в списке dicts для k в списке или строке

У меня есть пара словарей с разными значениями одних и тех же ключей. У меня есть список этих слов, и я хочу вернуть значения только из одного словаря на основе совпадающих ключей внутри другого списка или строки. Я хочу, чтобы он отражал dict с соответствующим индексом списка в качестве первой строки в другом списке.

group1 = {'1': [0, 0], '2': [2, 2], '3': [3, 3], '4': [4, 4], '5': [5, 5]}
group2 = {'1': [2, 2], '2': [0, 0], '3': [4, 4], '4': [5, 5], '5': [6, 6]}
group3 = {'1': [3, 3], '2': [4, 4], '3': [0, 0], '4': [6, 6], '5': [7, 7]}

group_selection = [group1, group2, group3]

example = ['2', '5', '3', '3', '1', '2']

groups_assigned = [group_selection[k] for k in example]
print(groups_assigned)
# Desired goal is [[0, 0], [6, 6], [4, 4], [4, 4], [2, 2], [0, 0]]   

Пока единственный способ, который сработал, это

result = [groups_assigned[1][k] for k in example]

Я хочу, чтобы меня выбрали из списка диктовок, чтобы получить правильный диктовку. Если первое значение в списке равно «2», оно должно вернуть значения dict group2 для всех оставшихся строковых значений в списке из остальных ключей в этом dict. «1» будет относиться к группе 1, «2» будет относиться к группе 2 для справки.

['1', '2', '4', '5'] = [[0, 0], [2, 2], [4, 4], [5, 5]] и ['3', '1'] = [[0,0], [3, 3]]

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
62
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я не уверен, понял ли я требования.

Я думаю, что это должно помочь:

result = [groups_assigned[int(example[0], 10)][k] for k in example]

Таким образом, вместо жесткого кодирования индекса в 1 вы можете прочитать нужный индекс из первого элемента итерируемого объекта (в вашем случае строки или списка) и преобразовать его в int. Таким образом, у вас есть доступ к индексу, начинающемуся с нуля.

Если вы измените его на

result = [groups_assigned[int(example[0], 10) - 1][k] for k in example]

У вас должно быть то, что вы хотите. Для списка, начинающегося с ['1', ...], у вас есть dict с индексом 0, для ['2', ...] у вас есть индекс 1 и так далее.

Конечно, этот способ не работает, если у вас есть только список с тремя словарями и примеры списков, таких как ['5',...] или ['-1',...]

Но это можно легко сделать

group1 = {"1": [0, 0], "2": [2, 2], "3": [3, 3], "4": [4, 4], "5": [5, 5]}
group2 = {"1": [2, 2], "2": [0, 0], "3": [4, 4], "4": [5, 5], "5": [6, 6]}
group3 = {"1": [3, 3], "2": [4, 4], "3": [0, 0], "4": [6, 6], "5": [7, 7]}

group_selection = [group1, group2, group3]

def assigned_groups(example: list[str]) -> list[list[int]]:
    global group_selection

    # -1 to convert 1 based index to 0 based index
    index = int(example[0], 10) - 1
    if not (0 <= index < len(group_selection)):
        raise ValueError("first element of example is invalid")

    return [group_selection[index][k] for k in example]
Ответ принят как подходящий

это должно подойти

result = [group_selection[int(example[0])-1][x] for x in example]
#declare variables group1, group2, group3 and their values as key, value pair of a dict 
dct =   {'group1' : {'1': [0, 0], '2': [2, 2], '3': [3, 3], '4': [4, 4], '5': [5, 5]},
         'group2' : {'1': [2, 2], '2': [0, 0], '3': [4, 4], '4': [5, 5], '5': [6, 6]},
         'group3' : {'1': [3, 3], '2': [4, 4], '3': [0, 0], '4': [6, 6], '5': [7, 7]}}

example = ['2', '5', '3', '3', '1', '2']

for x in dct.keys():

    # As the first element of example should be the order(index + 1) of dct
    if example[0] in x:

        # declare the reference dict if the condition fulfilled  
        ref_dct = dct[x]
        break

# values of ref_dct if keys being elements of example. Create as list
ls = [ref_dct[x] for x in example]

print(ls) # Output : [[0, 0], [6, 6], [4, 4], [4, 4], [2, 2], [0, 0]]

Другие вопросы по теме