for循环和if语句的词典翻译

2024-07-03 06:13:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我听说列表理解比嵌套for循环更有利

在Python课程中,我们学习for和while循环,而不是列表或字典理解。现在我正在努力改进我的代码。我通常是先在嵌套循环中写下我想要的东西,然后“翻译”成一个列表

在本例中,我尝试构建一个如下结构的词典:

{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循环,可以正常工作

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

其中杀虫汤是一本字典,从漂亮的汤里拉出来的。其结构如下:

{chemical_name_1 :
<!DOCTYPE html>
<html>
<head>some HTML code</head>,
chemical_name_2 :
<!DOCTYPE html>
<html>
<head>some HTML code</head>
}

rand\u links也是一个字典,简单地以化学名称作为键,URL作为值

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

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循环相同的结果,但得到的却是语法错误

请您:

  • 告诉我哪里出了问题,并帮助我纠正上述问题

  • 告诉我怎样才能在这方面学得更好

  • 您使用了哪些方法和资源来胜任这一特定技能

任何提示和帮助感谢


Tags: nameinfield列表forif字典html
2条回答

I have been told that list comprehension is advantageous over nested for loops.

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

foo = []
for thing in things:
    foo.append(thing + 5)

我认为上面的内容不如

foo = [thing + 5 for thing in things]

所以在这种情况下,我倾向于理解。然而,作为你的例子,理解

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非常适合的任务,代码可读性通常比以某种方式“优化”代码所获得的任何优势更有用

你必须从大的事情走向小的事情——重新安排你在听写理解中的“for”成为另一种方式

另外,对于嵌套的dict,请进行另一个理解,否则如果您的代码正常工作,您最多只能得到一个元素字典

记住,你可以在理解中使用普通函数您可以将单个事物作为函数进行解析,然后将fun(pesticideSoup[p])作为您的值

为了便于阅读,代码可以分成多行

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),或者因为你正在用tableText[n]:tableText[n+1]填充子目录(如果需要tableText[n])

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

相关问题 更多 >