python - 在 Python 中的列表中查找子组中的公共字符串
问题描述
我正在尝试通过删除重复项来清理列表。例如:
bb = ['Gppe (Aspirin Combined)',
'Gppe Cap (Migraine)',
'Gppe Tab',
'Abilify',
'Abilify Maintena',
'Abstem',
'Abstral']
理想情况下,我需要获得以下列表:
bb = ['Gppe',
'Abilify',
'Abstem',
'Abstral']
我尝试了什么:
拆分列表并删除重复项(一种天真的方法)
list(set(sorted([j for bb_i in bb for j in bb_i.split(' ')])))
这留下了很多“垃圾”:
['(Aspirin',
'(Migraine)',
'Abilify',
'Abstem',
'Abstral',
'Cap',
'Combined)',
'Gppe',
'Maintena',
'Tab']
- 找出最常见的词:
Counter(['Gppe (Aspirin Combined)', 'Gppe Cap (Migraine)', 'Gppe Tab').most_common(1)[0][0]
但我不确定如何找到相似的词(一组)??
我想知道,是否可以使用一种“groupby()”并首先按名称分组,然后删除这些名称中的重复项。
解决方案
你可以这样做,假设你想要每个字符串的唯一第一个单词:
bb = ['Gppe (Aspirin Combined)',
'Gppe Cap (Migraine)',
'Gppe Tab',
'Abilify',
'Abilify Maintena',
'Abstem',
'Abstral']
result = set(map(lambda x: x.split()[0], bb))
print(result)
输出
{'Gppe', 'Abstral', 'Abilify', 'Abstem'}
如果您想要按出现顺序排列的唯一元素列表,您可以执行以下操作:
bb = ['Gppe (Aspirin Combined)',
'Gppe Cap (Migraine)',
'Gppe Tab',
'Abilify',
'Abilify Maintena',
'Abstem',
'Abstral']
seen = set()
result = []
for e in bb:
key = e.split()[0]
if key not in seen:
result.append(key)
seen.add(key)
print(result)
输出
['Gppe', 'Abilify', 'Abstem', 'Abstral']
作为第一个解决方案的替代方案,您可以执行以下操作:
- 由@Jean-FrançoisFabre 推荐
{x.split()[0] for x in bb}
- 由@RoadRunner 推荐
set(x.split()[0] for x in bb)
推荐阅读
- knockout.js - 淘汰赛 - 根据表格中的选择列表选择显示复选框
- javascript - window.onerror 不适用于 Angular 5
- c# - 如何更改 HTML.GRID MVC C# 中单元格文本的文本颜色
- ajax - Woocommerce checkout ajax long delay when change of billing address
- vba - 将公式放入单元格,错误地插入值而不是公式?
- r - 秒表作为 R 的闪亮输入
- wordpress - 用于搜索的自定义 WP_Query
- php - 学生项目分配与管理系统
- java - 确定枚举的更高/最大值
- python - 在完全构造派生类之前调用派生方法?