Как я могу вызвать значение словаря в списке, только если оно соответствует условию? - PullRequest
1 голос
/ 17 мая 2019

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

Например, у меня есть этот список словаря:

status = [{'name': 'Carrousel', 'wait': 0, 'isOpen': True, 'single_rider': None},
 {'name': 'Balloon Flite', 'wait': 0, 'isOpen': True, 'single_rider': None},
 {'name': 'Skyrush', 'wait': 0, 'isOpen': False, 'single_rider': None},
 {'name': 'SooperDooperLooper',
  'wait': 5,
  'isOpen': True,
  'single_rider': None},
 {'name': 'Fahrenheit', 'wait': 20, 'isOpen': True, 'single_rider': None},
 {'name': 'Dummy', 'wait': 0, 'isOpen': False, 'single_rider': None}]

У меня также есть этот список:

route = ['Skyrush', 'SooperDooperLooper', 'Carrousel', 'Fahrenheit']

По сути, я хотел распечатать значения 'wait' в status для этих имен в route.

Я знаю, как вызывать значения строки, если я знаю индекс, но у меня возникают проблемы при попытке вызвать только те строки, которые содержат определенное значение 'name'.

Мой ожидаемый результат примерно такой:

0
5
0
20

Это в основном времена ожидания каждой соответствующей поездки в последовательном порядке в пределах route.

Спасибо! Любая помощь будет принята с благодарностью. Я просмотрел другие сообщения, но не смог найти ничего похожего на мой вопрос.

Ответы [ 4 ]

2 голосов
/ 17 мая 2019

Добавление тоже @ Криса ответа, чтобы получить ожидаемый заказ:

[d['wait'] for d in sorted(status, key=lambda x: ''.join(route).find(x['name'])) if d['name'] in route]

Выход:

[0, 5, 0, 20]
2 голосов
/ 17 мая 2019

Использование списка понимания:

[d['wait'] for d in status if d['name'] in route]

Выход:

[0, 0, 5, 20]
0 голосов
/ 17 мая 2019

Другой подход: измените свой ввод, чтобы вам было легче получать доступ к вещам

name_indexed_status = dict(map(lambda x: (x.pop("name"), x), status))
print (str(name_indexed_status))
for r in route:
    print(name_indexed_status[r]["wait"])

{
'Carrousel': {'wait': 0, 'isOpen': True, 'single_rider ': None},
' Balloon Flite ': {' wait ': 0,' isOpen ': True,' single_rider ': None},
' Skyrush ': {' wait ': 0,' isOpen': False,' single_rider ': None},
' SooperDooperLooper ': {' wait ': 5,' isOpen ': True,' single_rider ': None},
' Fahrenheit ': {' wait ':20, 'isOpen': True, 'single_rider': None},
'Dummy': {'wait': 0, 'isOpen': False, 'single_rider': None}
}

0
5
0
20

0 голосов
/ 17 мая 2019

Как указано в ответе @ Chris, понимание списка - это путь.

Однако, если вы хотите, чтобы ордер соответствовал вашему route, это было бы решением:

[next(s for s in status if s['name'] == name)['wait'] for name in route]

Это фактически дает вам [0, 5, 0, 20] вместо [0, 0, 5, 20].

Это также напрямую отвечает на ваш актуальный вопрос: как получить доступ к элементу списка в списке словарей, ссылаясь на словарьключ.

next(item for item in some_list_of_dicts if s['key'] == 'some value')

Получает первый элемент, соответствующий условию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...