Python BeautifulSoup输出转集合及有序去重数据结构问题
问题1:单行实现带strip()处理的set转换
直接使用集合推导式即可,和你原本手写循环的逻辑完全等价:
stripped = {text.strip() for text in visible_texts}
如果要直接作为函数返回值,甚至可以把前面的filter逻辑也合并进去,整行实现整个函数的核心逻辑:
return {text.strip() for text in filter(tag_visible, soup.find_all(text=True))}
你之前用的set(visible_texts)只能直接把可迭代对象转成集合,没法直接对元素做额外处理,除了集合推导式,也可以用set(map(str.strip, visible_texts))实现同样效果,但集合推导式可读性更高,后续如果要加过滤逻辑(比如过滤掉strip后为空的空白文本)也更方便,直接在推导式里加判断条件即可。
问题2:去重且保留插入顺序的数据结构
标准库就有对应实现,不需要安装第三方包,根据Python版本选择即可:
- Python 3.7及以上版本:内置
dict默认强制保证插入顺序,利用字典键天然不重复的特性就能实现需求,写法如下:
# 得到的结果去重,且保留元素首次出现的顺序 stripped_ordered = dict.fromkeys(text.strip() for text in visible_texts).keys()
如果需要可变的序列结构,直接在外层套list()就能转成顺序固定、无重复的列表。
- Python 3.6及更早版本:使用
collections模块中的OrderedDict即可,用法和内置dict完全一致:
from collections import OrderedDict stripped_ordered = OrderedDict.fromkeys(text.strip() for text in visible_texts).keys()
这两种实现的时间效率都很高,字典键的查找是O(1)复杂度,比手动遍历判断元素是否存在的写法性能好很多。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

