首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用两个列表之间的部分字符串匹配生成具有列表理解能力的列表

使用两个列表之间的部分字符串匹配生成具有列表理解能力的列表
EN

Stack Overflow用户
提问于 2022-08-01 05:37:25
回答 1查看 57关注 0票数 0

我有一份大概的清单。150个矿物名称与已批准的几千个矿物名称清单中的对应名称不完全匹配;我名单中的一些矿物名称与其核准的矿物名称有某种不同(例如,我可能有一个条目“角闪石(巴罗斯特)”,而不是已被接受的‘巴罗斯特’)。

我需要一个清单,其中包括~150个批准的同等矿物名称。我认为这样做的方法是使用列表理解来从两个列表中的条目之间的部分匹配生成一个新的列表,但是我无法得到任何工作。我以前检查过像Partial String match between two lists in python这样的,但没有运气。

我的名单和核准清单中的条目示例如下:

approved_list = ['Aegirine','Barroisite','Cuprite','Pyrope','Rosasite','Traskite','Vaesite']

my_list = ['Pyroxene(Aegirine)','Amphibole(Barroisite)','Cuprite','Garnet(Pyrope)', 'Rosasite']

在上面的示例中,我将理想地生成一个列表,包括Aegirine、Barroisite、Cuprite、Pyrope和Rosasite。解决办法还需要灵活(例如不能依靠括号的位置),因为有些条目之间有许多不同之处。

提前感谢您的任何想法!

EN

回答 1

Stack Overflow用户

发布于 2022-08-01 08:21:13

很难用模糊的要求提供一个完整的答案。您必须更清楚地说明哪些变化是可能的。

但是,这里有一个忽略大写、额外/缺失的数字符号(比如umlaut -假设字符没有ä -> a而不是ä -> ae)和空格的例子:

代码语言:javascript
复制
import unicodedata


def strip_diacritics(s):
    return ''.join(
        # break down into characters after normalising:
        c for c in unicodedata.normalize('NFD', s)  
        # not a non-spacing mark:
        if unicodedata.category(c) != 'Mn'  
    )


approved_list = ['Aegirine', 'Barroisite', 'Cuprite', 'Pyrope', 'Rosasite', 'Traskite', 'Vaesite']

my_list = ['Pyroxene(Aegirine)', 'Amphibole(Barroïsite)', 'cuprite', 'Garnet (Pyrope)', 'Rosasite ']

# create a quick lookup from normalised name to desired name
approved_dict = {strip_diacritics(name).strip().lower(): name for name in approved_list}

new_list = [
    next(name for key, name in approved_dict.items()
         if key in strip_diacritics(test).strip().lower())
    for test in my_list
]

print(new_list)

请注意,我是如何在my_list中引入一些问题的,以及这如何不影响结果。输出:

代码语言:javascript
复制
['Aegirine', 'Barroisite', 'Cuprite', 'Pyrope', 'Rosasite']
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73189191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档