在Python中查找列表中子组中的公共字符串

4

我想要清理一个列表,去掉其中的重复项。例如:

 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()”方法,首先按名称进行分组,然后在这些名称中删除重复项。

3个回答

6

假设你想要每个字符串中独特的第一个单词,那么你可以这样做:

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)

4
"set(map(lambda x: x.split()[0], bb))" 这段代码不太优美。使用集合推导式可能更易读,如:"{x.split()[0] for x in bb}"。已经压缩过了。 - Jean-François Fabre
1
也可以执行 set(x.split()[0] for x in bb) - RoadRunner
另外,如果您想要维护顺序,则list(collections.OrderedDict.fromkeys(x.split()[0] for x in bb).keys())是另一种方式。 - RoadRunner
太棒了!非常感谢你们!学习整洁和Pythonic的方法总是很棒的。 - Arnold Klein

5
如果顺序无关紧要,您可以使用集合推导式:
res = list({x.split()[0] for x in bb})

如果顺序很重要,并且您使用的是Python 3.6或更高版本,则可以使用字典推导式:

res = list({x.split()[0]:None for x in bb})

如果顺序很重要并且你使用的是Python 3.5或更低版本,你可以使用OrderedDict:
from collections import OrderedDict
res = list(OrderedDict((x.split()[0],None) for x in bb))

1
你可以尝试拆分每个项目并仅收集分隔符(空格)之前的第一个字符串。
print(list(set(item.split(' ',1)[0] for item in bb)))

这是获取您所需内容的方式:
['Abilify', 'Abstem', 'Gppe', 'Abstral']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接