Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.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
Python 在另一个列表理解中筛选列表理解_Python_Python 3.x_List Comprehension - Fatal编程技术网

Python 在另一个列表理解中筛选列表理解

Python 在另一个列表理解中筛选列表理解,python,python-3.x,list-comprehension,Python,Python 3.x,List Comprehension,这是我目前的代码: [[td.text.strip()用于tr中的td.find_all('td')]用于表中的tr.find_all('tr')] 本质上,我所做的是解析从网页获取的BeautifulSoup+请求表的输出。不管目的是什么,tr.find_all('td')]中td的部分[td.text.strip()给了我一个表示行的列表,它工作正常。不过,我想要的是过滤这个列表,删除第一个元素为空字符串的行。所以,我的代码会变成 [[td.text.strip()用于tr中的td.fin

这是我目前的代码:

[[td.text.strip()用于tr中的td.find_all('td')]用于表中的tr.find_all('tr')]
本质上,我所做的是解析从网页获取的BeautifulSoup+请求表的输出。不管目的是什么,tr.find_all('td')]中td的部分
[td.text.strip()给了我一个表示行的列表,它工作正常。不过,我想要的是过滤这个列表,删除第一个元素为空字符串的行。所以,我的代码会变成

[[td.text.strip()用于tr中的td.find_all('td')]用于表中的tr.find_all('tr')。如果[td.text.strip()用于tr.find_all('td')][0]!“”
这是令人伤心和可怕的。我来自Scala的函数编程背景,所以使用map、filter和reduce操作对我来说很好,但是在Python中,它们返回
map对象
,而不是一个正确的列表,所以还有另一个
列表(map(lambda:…)
,对于每个高阶函数调用,这里和那里都有大量的括号,这使得代码看起来非常糟糕

在保持可读性的同时,是否有一种类似Python的方法来实现这一点? 我几乎要使用simple
.append()
来让它可读,尽管我一点也不觉得它像python

编辑:我真的需要一个列表列表,因为我将多次执行此操作,读取多个表,然后可能将它们全部追加,所以请不要尝试更改代码结构的这一部分

编辑2:这是我当前未过滤的输出。我的目标是过滤掉前两行

[
 ['', '', '', ''],
 ['', '', 'Taxas de juros'],
 ['Posição', 'Instituição', '% a.m.', '% a.a.'],
 ['1', 'SINOSSERRA S/A - SCFI', '0,41', '5,03'],
 ['2', 'GRAZZIOTIN FINANCIADORA SA CFI', '0,84', '10,55'],
 ['3', 'BCO CATERPILLAR S.A.', '0,89', '11,27'],
 ['4', 'BCO VOLKSWAGEN S.A', '0,91', '11,49']
]
我愿意

[[td.text.strip() for td in tr.find_all('td')] 
 for tr in table.find_all('tr') 
 if tr.find('td').text.strip()]

因为
tr.find('td')
将返回第一个子级
td
。该子级的剥离文本要么有长度,要么没有长度。在Python中,长度大于0的字符串的计算结果为True。

在两次传递中就足以完成以下操作:

lst = [[td.text.strip() for td in tr.find_all('td')] for tr in table.find_all('tr')]
[i for i in lst if i[0] != '']
要获得:

[['Posição', 'Instituição', '% a.m.', '% a.a.'],
 ['1', 'SINOSSERRA S/A - SCFI', '0,41', '5,03'],
 ['2', 'GRAZZIOTIN FINANCIADORA SA CFI', '0,84', '10,55'],
 ['3', 'BCO CATERPILLAR S.A.', '0,89', '11,27'],
 ['4', 'BCO VOLKSWAGEN S.A', '0,91', '11,49']]
您可以通过这种方式一次完成:

[i for i in [[td.text.strip() for td in tr.find_all('td')]
             for tr in table.find_all('tr')] if i[0] != '']

你意识到地图对象是可编辑的吗?但你只能使用它一次。你能使用css选择器吗?不确定,但类似于
table.find_all(tr:not(td:first child:empty))
(我不是一个经常使用css的人…)我知道它是可编辑的,但我需要一个列表,因为我打算在其他库中的代码上进一步使用它(作为熊猫)。至于css,它将不起作用,因为我的行是一个字符串-我正在使用strip方法将其转换为列表。我需要按第一个字符串进行筛选,这会使我的情况更糟。请查看我的编辑。您似乎已经理解,行将完全为空,而不是这样。我需要按第一个位置进行筛选返回行的字符串。将不存在空字符串-可筛选行类似于
“,”
,如果我读得好的话,你的代码并没有很好地涵盖它。是的,确实如此,我不明白为什么。我第一次读错了。我现在明白了。接受答案。谢谢!非常圆滑。这很管用,而且看起来更好。我只是等着看是否没有看到任何“更聪明”的东西(不确定那会是什么,但无论如何),否则,接受这个答案。