有人告诉我,列表理解比嵌套循环更有利。
在我学习的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
pesticideSoup是一本字典,从美丽的汤中提取出来。它的结构如下:
{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循环转换为字典理解的尝试:
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循环相同的结果,但我得到的是语法错误。
请你:
任何提示和帮助都会得到赏识!
发布于 2019-07-31 14:59:11
你必须从大的事情到小的事情-重新排列你的“为”在分词理解为相反的方式。;)
另外,对于嵌套的字典,执行另一个理解,否则如果代码工作,您将得到最多的单元素字典。
记住,您可以在理解中使用正常的函数!,您可以将单个事物解析为一个函数,然后将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)
,因为你正在用tableTextn:tableTextn+1填充你的潜艇(如果需要tableTextn的话)?
但是这个版本实际上是可读的,并且有可能你会更好地发现你可能做过的任何错误。(或者做我提到的功能。)
发布于 2019-07-31 14:44:24
有人告诉我,列表理解比嵌套循环更有利。
就像任何与风格相关的东西一样,这在某种程度上是一个偏好的问题。对于代码来说,可读性是一个很大的好处。
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非常适合的任务,代码可读性通常比以某种方式“优化”代码所获得的任何优势都更有用。
https://stackoverflow.com/questions/57293277
复制相似问题