首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将循环语句和if语句翻译成字典理解

将循环语句和if语句翻译成字典理解
EN

Stack Overflow用户
提问于 2019-07-31 14:36:13
回答 2查看 112关注 0票数 0

有人告诉我,列表理解比嵌套循环更有利。

在我学习的Python课程中,我们学习了for和while循环,而不是列表或字典理解。现在我正在努力改进我的代码。我通常是通过在嵌套循环中写我想要的,然后“转换”成列表理解来做到这一点。

在这种情况下,我试图构建一个如下结构的字典:

代码语言:javascript
运行
复制
{chemical_name_1 :
{field_1: xxxx
field_2: yyyy
field_3: zzzz}
{chemical_name_2 :
{field_1: xxxy
field_2: yyyz
field_3: zzzx}
...}

这是使用工作良好的if语句的for循环。

代码语言:javascript
运行
复制
wantedfields= ["ADI","General human health issues","CAS RN"]

results={}
for p in rand_links.keys():
    tableText = [td.text.strip() for td in pesticideSoup[p].find_all("td", recursive=True)]
    resd={}
    for n,t in enumerate(tableText):
        for field in wantedfields:
            if field in t:
                 resd[t]=tableText[n+1]
            results[p]=resd

pesticideSoup是一本字典,从美丽的汤中提取出来。它的结构如下:

代码语言:javascript
运行
复制
{chemical_name_1 :
<!DOCTYPE html>
<html>
<head>some HTML code</head>,
chemical_name_2 :
<!DOCTYPE html>
<html>
<head>some HTML code</head>
}

rand_links也是一个字典,简单地以化学名称作为键,以一个URL作为值。

这是我将嵌套的for循环转换为字典理解的尝试:

代码语言:javascript
运行
复制
results = {p: {t:tableText[n+1] if field in t} for field in wantedfields for t in [td.text.strip() for td in pesticideSoup[p].find_all("td", recursive=True)] for p in rand_links.keys()}

我希望得到与嵌套的for循环相同的结果,但我得到的是语法错误。

请你:

  • 告诉我哪里出了问题,帮我纠正上面的问题。
  • 告诉我如何才能更好地掌握这一点。
  • 你用什么方法和资源才能胜任这一特定的技能?

任何提示和帮助都会得到赏识!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-31 14:59:11

你必须从大的事情到小的事情-重新排列你的“为”在分词理解为相反的方式。;)

另外,对于嵌套的字典,执行另一个理解,否则如果代码工作,您将得到最多的单元素字典。

记住,您可以在理解中使用正常的函数!,您可以将单个事物解析为一个函数,然后将fun(pesticideSoup[p])作为您的值!

为了提高可读性,代码可以分成多行。

代码语言:javascript
运行
复制
results = {p: {t:tableText[n+1] 
               for t in [td.text.strip() for td in pesticideSoup[p].find_all("td", recursive=True)]
               for field in wantedfields if field in t} 
           for p in rand_links.keys()}

^这基本上就是你修改的代码。

它会崩溃,因为我不知道在这种情况下tableText到底意味着什么--实际上,我也不理解你原来的for n,t in enumerate(tableText),因为你正在用tableTextn:tableTextn+1填充你的潜艇(如果需要tableTextn的话)?

但是这个版本实际上是可读的,并且有可能你会更好地发现你可能做过的任何错误。(或者做我提到的功能。)

票数 1
EN

Stack Overflow用户

发布于 2019-07-31 14:44:24

有人告诉我,列表理解比嵌套循环更有利。

就像任何与风格相关的东西一样,这在某种程度上是一个偏好的问题。对于代码来说,可读性是一个很大的好处。

代码语言:javascript
运行
复制
foo = []
for thing in things:
    foo.append(thing + 5)

我认为上面的内容不如

代码语言:javascript
运行
复制
foo = [thing + 5 for thing in things]

所以在这种情况下,理解将是我的首选。然而,对于你的例子,理解

代码语言:javascript
运行
复制
results = {p: {t:tableText[n+1] if field in t} for field in wantedfields for t in [td.text.strip() for td in pesticideSoup[p].find_all("td", recursive=True)] for p in rand_links.keys()}

是(国际海事组织)一个可怕的不可读的混乱。你想让别人为你写这段代码吗?使用多行循环的“解压”版本可能会大大提高可读性,因此,尽管它占用了更多的代码行,但这将是我的首选。

代码中的“更好”和“更糟”是主观的--这取决于你想要什么。对于python非常适合的任务,代码可读性通常比以某种方式“优化”代码所获得的任何优势都更有用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57293277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档