Однострочный условный оператор if
Это первый вопрос, который я задаю на этом форуме, поэтому я приветствую ваши отзывы о том, как сделать это более полезным для других.
Скажи, у меня есть этот список:
IDs = ['First', 'Second', 'Third']
и этот словарь:
statistics = {('First', 'Name'):"FirstName", ('Second','Name'):"SecondName", ('Third','Name'):"ThirdName"}
Есть ли короче, легче читать однострочник, чем следующий?
firstID = IDs[[statistics[ID,'Name'] for ID in IDs].index('FirstName')]
Большое спасибо
2 ответа
Более эффективный (и, вероятно, более читаемый) подход был бы следующим:
firstID = next(id for id in IDs if statistics[(id,'Name')]=='FirstName')
Это определяет генератор, который проверяет IDs
в порядке, и дает значения из statistics
равный "FirstName"
, next(...)
используется для извлечения первого значения из этого итератора. Если подходящего имени не найдено, это вызовет StopIteration
,
# If you ever plan to change the order of IDs:
firstID = IDs[IDs.index('First')]
# If you are literally just looking for the first ID in IDs:
firstID = IDs[0]
Если вы посмотрите на свой код в этих двух строках:
IDs = ['First', 'Second', 'Third']
firstID = IDs[[statistics[ID,'Name'] for ID in IDs].index('FirstName')]
Индекс 'FirstName'
в вашем вновь созданном списке ВСЕГДА будет равен индексу 'First'
в IDs
, Потому что ваше понимание списка будет повторяться IDs
в порядке и положить соответствующий dict
значения в таком порядке, вы всегда будете создавать 'FirstName'
в том же индексе, что и 'First'
появляется в IDs
, Поэтому гораздо эффективнее просто вызвать его из этого списка одним из перечисленных выше методов.