首页 > 解决方案 > 使用正则表达式删除列表中的重复项并保留第一

问题描述

我有一个 python 列表,例如

my_list = [
    'NIJG01002710.1_2-HSPs_-__Canis_lupus',
    'scaffold_313646_1-397_-__Homo_sapiens',
    'scaffold_366690_1-238_+__Homo_sapiens',
    'NIJG01003276.1_11652-11883_-__Cattus_cattus',
    'NIJG01006295.1_7474-7678_-__Cattus_cattus','YP_009353','NP_87899'
]

而且我只想根据模式_-__或, 之后的元素保留第一个重复值,并_+__在这里重复两次。Cattus_cattusHomo_sapiens

在这里我应该得到:

[
    'NIJG01002710.1_2-HSPs_-__Canis_lupus',
    'scaffold_313646_1-397_-__Homo_sapiens',
    'NIJG01003276.1_11652-11883_-__Cattus_cattus','YP_009353','NP_87899'
]

到目前为止,我知道如何使用以下代码删除重复项:

mylist = list(dict.fromkeys(mylist))

但我不知道如何只在正则表达式模式后使用重复元素来做到这一点。

一种方法是首先使用以下模式删除所有内容:

my_list=[re.sub(r'*_?__', '', i) for i in x] 

然后使用:

mylist = list(dict.fromkeys(mylist))

但是通过这种方式,我在需要保留的模式之前丢失了信息。

标签: pythonlist

解决方案


my_list = [
    'NIJG01002710.1_2-HSPs_-__Canis_lupus',
    'scaffold_313646_1-397_-__Homo_sapiens',
    'scaffold_366690_1-238_+__Homo_sapiens',
    'NIJG01003276.1_11652-11883_-__Cattus_cattus',
    'NIJG01006295.1_7474-7678_-__Cattus_cattus']


print([f'{value}__{key}' for key, value in
       dict(item.split('__')[::-1] for item in 
       my_list[::-1]).items()][::-1])

输出

['NIJG01002710.1_2-HSPs_-__Canis_lupus',
 'scaffold_313646_1-397_-__Homo_sapiens',
 'NIJG01003276.1_11652-11883_-__Cattus_cattus']

推荐阅读