这是我在这个论坛上提出的第一个问题,所以我欢迎你提出反馈意见,让这对其他人更有帮助。
说我有这个清单:
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')]
非常感谢
答案 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}}。因此,使用上述方法之一从列表中调用它会更有效率。