Я пытаюсь вывести словарь, который заполняет значения, уже определенные другим словарем. Значения, которые не были определены, возвращают 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]}
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)
Вы можете получить желаемый результат на определенном входе, просто изменив порядок итератора, как показано ниже.
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]}
Вот правильный код для получения желаемого результата:
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)
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.