Python 单行条件赋值if语句

Python 单行条件赋值if语句,python,for-loop,if-statement,for-in-loop,Python,For Loop,If Statement,For In Loop,这是我在这个论坛上要问的第一个问题,所以我欢迎你的反馈,让这对其他人更有帮助 假设我有这个清单: IDs = ['First', 'Second', 'Third'] 这本字典: statistics = {('First', 'Name'):"FirstName", ('Second','Name'):"SecondName", ('Third','Name'):"ThirdName"} 有没有比下面一行更简短、更容易阅读的行文 firstID = IDs[[statistics[ID,'

这是我在这个论坛上要问的第一个问题,所以我欢迎你的反馈,让这对其他人更有帮助

假设我有这个清单:

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')]
非常感谢

一种更有效(可能更可读)的方法是:

firstID = next(id for id in IDs if statistics[(id,'Name')]=='FirstName')
这定义了一个函数,它按顺序检查
ID
,并从
统计数据中生成等于
FirstName
的值。用于从此迭代器检索第一个值。如果没有找到匹配的名称,这将引发
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'
的索引将始终等于
IDs
'First'
的索引。由于您的列表理解将按顺序迭代
IDs
,并将相应的
dict
值按该顺序排列,因此您将始终在
IDs
中出现的
'First'
索引处创建
'FirstName'
。因此,使用上述方法之一从列表中调用它要有效得多。

@Jean-Françoisfare:在我看来,只要你读了这一行的其余部分就行了。虽然不是很有效的设计,但我认为它是不正确的!有什么特别的原因让你的dict朝这个方向,而不是切换键和值?如果你需要在两个方向上查找,你是否考虑过制作第二个反向dict?你想做什么?我不明白你的目的……为什么会这样?谢谢你,这正是我想要的!谢谢,但我只是想通过使用元素的名称('FirstName')来搜索元素的ID('First')