我有以下代码,为了学习,我希望看到一种更加pythonic的方法来实现这个目标:
for value in response.values():
for encod in encodings:
if encod.lower() in value.lower():
return(encod)
答案 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