У меня есть пара словарей с разными значениями одних и тех же ключей. У меня есть список этих слов, и я хочу вернуть значения только из одного словаря на основе совпадающих ключей внутри другого списка или строки. Я хочу, чтобы он отражал 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]]
Я не уверен, понял ли я требования.
Я думаю, что это должно помочь:
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]]