一行条件赋值if语句

时间:2017-06-26 19:07:14

标签: 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,'Name'] for ID in IDs].index('FirstName')]

非常感谢

2 个答案:

答案 0 :(得分:2)

更有效(也可能更具可读性)的方法是:

firstID = next(id for id in IDs if statistics[(id,'Name')]=='FirstName')

这定义了generator按顺序检查IDs,并从statistics得到等于"FirstName"的值。 next(...)用于从此迭代器中检索第一个值。如果找不到匹配的名称,则会引发StopIteration

答案 1 :(得分:0)

# 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 1}}。因此,使用上述方法之一从列表中调用它会更有效率。