Однострочный условный оператор 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, Поэтому гораздо эффективнее просто вызвать его из этого списка одним из перечисленных выше методов.

Другие вопросы по тегам