0

我有以下代码,为了学习,希望看到一种更 Pythonic 的方式来实现这一点:

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

5 回答 5

10

假设您实际上打算只返回您找到的第一个匹配项(这就是您的代码所做的),除了最后一行中不必要的括号外,您的代码没有什么不符合 Python 标准的,您可以将其替换为:

            return encod

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

参见:Python 之禅

于 2013-08-15T20:51:50.770 回答
4

如果您正在寻找其他方式,可以使用以下方法:

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

其中的部分next(...)是一个生成器表达式,如果满足条件,则为每个in生成每个encodin 。这个生成器的第一个元素是我们返回的(参见 参考资料)。encodings valueresponse.values() encod.lower() in value.lower()next()

虽然,在实践中,我通常会选择你已经拥有的。这是做你想做的事情的最简单和最清晰的方法,而且绝不是非Pythonic。

于 2013-08-15T20:42:51.827 回答
1

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

return next(v for v in response.values() if v.lower in map(lower, encodings))
于 2013-08-15T20:43:14.517 回答
0

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

    import itertools
    for (encoding, value) in itertools.product(encodings, response.values()):
        if encoding.lower() in value.lower():
            return encoding
于 2013-08-15T22:19:26.363 回答
0

您可以将其作为列表输出吗?列表推导会使其更加 Pythonic。

return [encod for value in response.values() for encod in encodings if encod.lower() in value.lower()]
于 2013-08-15T20:42:42.883 回答