首页 > 解决方案 > 在 Python 中的列表中查找子组中的公共字符串

问题描述

我正在尝试通过删除重复项来清理列表。例如:

 bb = ['Gppe (Aspirin Combined)', 
       'Gppe Cap (Migraine)',  
       'Gppe Tab', 
       'Abilify', 
       'Abilify Maintena', 
       'Abstem', 
       'Abstral']

理想情况下,我需要获得以下列表:

 bb = ['Gppe', 
       'Abilify', 
       'Abstem', 
       'Abstral']

我尝试了什么:

  1. 拆分列表并删除重复项(一种天真的方法)

    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']
  1. 找出最常见的词:

Counter(['Gppe (Aspirin Combined)', 'Gppe Cap (Migraine)', 'Gppe Tab').most_common(1)[0][0]

但我不确定如何找到相似的词(一组)??

我想知道,是否可以使用一种“groupby()”并首先按名称分组,然后删除这些名称中的重复项。

标签: pythonlistduplicates

解决方案


你可以这样做,假设你想要每个字符串的唯一第一个单词

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']

作为第一个解决方案的替代方案,您可以执行以下操作:

  1. 由@Jean-FrançoisFabre 推荐{x.split()[0] for x in bb}
  2. 由@RoadRunner 推荐set(x.split()[0] for x in bb)

推荐阅读