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

Код:

route1 = {
    'RouteID': 1,
    'StepID': [1, 2, 3, 4],
    'StepName': ['104-1', '104-2', '105-A', '105-B'],
    'Direction': ['Left', 'Right', 'Right', 'Left']}

route2 = {
    'RouteID': 2,
    'StepID': [1, 2, 3, 4],
    'StepName': ['104-2', '105-A', '105-C', '105-D'],
    'Direction': []}

def routeMapper(longRoute, subRoute):
    for i, v in enumerate(longRoute['StepName']):
        found = False
        for j, b in enumerate(subRoute['StepName']):
            if v == b:
                found = True
                subRoute['Direction'].append(longRoute['Direction'][i])
        if not found:
            subRoute['Direction'].append(False)

routeMapper(route1, route2)
print(route2)

Вывод:

{'RouteID': 2, 'StepID': [1, 2, 3, 4], 'StepName': ['104-2', '105-A', '105-C', '105-D'], 'Direction': [False, 'Right', 'Right', False]}

Вывод, который я ищу (в ключе "Направление"):

{'RouteID': 2, 'StepID': [1, 2, 3, 4], 'StepName': ['104-2', '105-A', '105-C', '105-D'], 'Direction': ['Right', 'Right', False, False]}
-2
user18104926 4 Фев 2022 в 10:29
Если вы повторите subRoute и сопоставите его с longRoute, вы получите ожидаемый результат на данном входе. Внешний: для i, v в enumerate(subRoute['StepName']): Внутренний: для j, b в enumerate(longRoute['StepName']):
 – 
basit raza
4 Фев 2022 в 10:37
Извините, но это не сработало. У меня есть Лево, Право, Ложь, Ложь. Мне нужно получить Правильно, Правильно, Ложь, Ложь. Каждый индекс в «Имя шага» должен соответствовать одному и тому же индексу в «Направление».
 – 
user18104926
4 Фев 2022 в 10:44

3 ответа

Лучший ответ

Поскольку сначала вы перечисляете longRoute, порядок subRoute['Direction'] будет зависеть от порядка longRoute['StepName'], а не subRoute['StepName'].

Просто сначала переберите subRoute, чтобы сохранить порядок, а затем сравните с longRoute.

def routeMapper(longRoute, subRoute):
for i, v in enumerate(subRoute['StepName']):
    found = False
    for j, b in enumerate(longRoute['StepName']):
        if v == b:
            found = True
            subRoute['Direction'].append(longRoute['Direction'][j])
    if not found:
        subRoute['Direction'].append(False)
0
donotread123 4 Фев 2022 в 10:55
Спасибо вам за разъяснение!
 – 
user18104926
4 Фев 2022 в 11:07

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

route1 = {
    'RouteID': 1,
    'StepID': [1, 2, 3, 4],
    'StepName': ['104-1', '104-2', '105-A', '105-B'],
    'Direction': ['Left', 'Right', 'Right', 'Left']}

route2 = {
    'RouteID': 2,
    'StepID': [1, 2, 3, 4],
    'StepName': ['104-2', '105-A', '105-C', '105-D'],
    'Direction': []}

def routeMapper(longRoute, subRoute):
    for i, v in enumerate(subRoute['StepName']):
        found = False
        for j, b in enumerate(longRoute['StepName']):
            if v == b:
                found = True
                subRoute['Direction'].append(longRoute['Direction'][j])
        if not found:
            subRoute['Direction'].append(False)

Выход:

{'RouteID': 2, 'StepID': [1, 2, 3, 4], 'StepName': ['104-2', '105-A', '105-C', '105-D'], 'Direction': ['Right', 'Right', False, False]}
0
basit raza 4 Фев 2022 в 10:46
Извините, но это не сработало. У меня есть Лево, Право, Ложь, Ложь. Мне нужно получить Правильно, Правильно, Ложь, Ложь. Каждый индекс в «Имя шага» должен соответствовать одному и тому же индексу в «Направление».
 – 
user18104926
4 Фев 2022 в 10:45
Вы можете получить направление из индекса longRoute. Проверьте, я обновил код ответа.
 – 
basit raza
4 Фев 2022 в 10:47
Это работает, спасибо вам большое!
 – 
user18104926
4 Фев 2022 в 10:50

Вот правильный код для получения желаемого результата:

route1 = {
    'RouteID': 1,
    'StepID': [1, 2, 3, 4],
    'StepName': ['104-1', '104-2', '105-A', '105-B'],
    'Direction': ['Left', 'Right', 'Right', 'Left']}

route2 = {
    'RouteID': 2,
    'StepID': [1, 2, 3, 4],
    'StepName': ['104-2', '105-A', '105-C', '105-D'],
    'Direction': []}

def routeMapper(longRoute, subRoute):
    for i, v in enumerate(subRoute['StepName']):
        found = False
        for j, b in enumerate(longRoute['StepName']):
            if v == b:
                found = True
                subRoute['Direction'].append(longRoute['Direction'][j])
        if not found:
            subRoute['Direction'].append(False)

routeMapper(route1, route2)
print(route2)
0
Karthik Dasari 4 Фев 2022 в 10:49