pythonic处理嵌套for循环的方法

时间:2013-08-15 20:37:58

标签: python python-3.3

我有以下代码,为了学习,我希望看到一种更加pythonic的方法来实现这个目标:

for value in response.values():
    for encod in encodings:
        if encod.lower() in value.lower():
            return(encod)

5 个答案:

答案 0 :(得分:10)

假设您实际上只想返回您找到的第一个匹配项(这是您的代码所做的),除了最后一行中不必要的括号外,您的代码没有任何语法,您可以将其替换为:

            return encod

Pythonic 意味着'写一个单行'或'为了它而使用Python的特定功能'。除其他外,它意味着“以最容易理解和最具表现力的方式编写代码”。

另请参阅:the Zen of Python

答案 1 :(得分:4)

如果您正在寻找不同的方式,可以使用此方法:

return next(encod for value in response.values() 
                      for encod in encodings 
                          if encod.lower() in value.lower())

next(...)中的generator expression部分为encod encodings value生成response.values() encod.lower() in value.lower() } 如果满足条件{{1}}。这个生成器的第一个元素就是我们返回的内容(参见next())。

虽然,在实践中,我通常会选择你已经拥有的东西。这是做你想做的事情最简单,最清晰的方式,绝不是 un pythonic。

答案 2 :(得分:1)

您的代码只返回第一个匹配的实例,但您仍然可以使用列表推导或更好的生成器表达式。

return next(v for v in response.values() if v.lower in map(lower, encodings))

答案 3 :(得分:0)

您可以将其作为列表输出吗?列表理解会使它更像Pythonic。

return [encod for value in response.values() for encod in encodings if encod.lower() in value.lower()]

答案 4 :(得分:0)

只是提供另一种使用笛卡尔积的方法。我喜欢这个,因为它符合我的想法:“检查每一对值。”

    import itertools
    for (encoding, value) in itertools.product(encodings, response.values()):
        if encoding.lower() in value.lower():
            return encoding