Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
处理嵌套for循环的pythonic方法_Python_Python 3.3 - Fatal编程技术网

处理嵌套for循环的pythonic方法

处理嵌套for循环的pythonic方法,python,python-3.3,Python,Python 3.3,我有以下代码,为了学习,我希望看到一种更具python风格的方法来实现这一点: for value in response.values(): for encod in encodings: if encod.lower() in value.lower(): return(encod) 您可以将其输出为列表吗?列表理解会让它更像蟒蛇 return [encod for value in response.values() for encod i

我有以下代码,为了学习,我希望看到一种更具python风格的方法来实现这一点:

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

您可以将其输出为列表吗?列表理解会让它更像蟒蛇

return [encod for value in response.values() for encod in encodings if encod.lower() in value.lower()]
如果您正在寻找不同的方法,可以使用以下方法:

return next(encod for value in response.values() 
                      for encod in encodings 
                          if encod.lower() in value.lower())
next(…)
中的部分是a,如果满足条件
encod.lower()
,则为
response.values()中的每个
值生成
编码中的每个
编码。此生成器的第一个元素是我们返回的内容(请参阅)


虽然,在实践中,我通常会选择你已经拥有的。这是最简单、最清晰的方法来完成您要做的事情,而且绝不是不连贯的。

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

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

假设您实际上只打算返回找到的第一个匹配项(这就是您的代码所做的),那么除了最后一行中不必要的括号外,您的代码没有任何不符合语法的地方,您可以用以下括号替换:

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


另请参见:

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


获取
AttributeError:“generator”对象没有属性“next”
名称错误:未定义全局名称“encod”
我认为您颠倒了循环的顺序,这应该可以,因为我们只需要第一个循环,但这值得澄清,因为双重理解的语法太混乱了。@user1991424你确定回程线上会发生这种情况吗?啊,谢谢。我一直在努力学习何时/如何使用next()函数。谢谢大家!+1谢谢你没有责骂我和教我。-1这几乎不是更惯用的-它在可读性和效率方面没有任何好处。它必须是str,我可以在返回列表后使用循环,但理想情况下,只是尝试一下@user1991424的确切含义是什么?这将把符合您的条件的每个
编码添加到一个列表中,然后您可以
.join()
如果愿意的话?在我的回答.values()中,我知道编码中最多只能有一个编码匹配。我只需要返回第一场比赛。如果你没有看到它,这里又是:“为了学习”。我同意你的观点,但我想学习如何通过其他方式实现这一点。@user1991424我确实看到了,是的。我还看到您要求“一种更具Python风格的方式”来编写代码。学习的一部分就是学习pythonic这个词的意思。@user1991424:你还说你“希望看到一种更具pythonic风格的方法来实现这一点”。这与“其他方式”非常不同,如果其他方式不太像蟒蛇。
    import itertools
    for (encoding, value) in itertools.product(encodings, response.values()):
        if encoding.lower() in value.lower():
            return encoding