我有一份大概的清单。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。解决办法还需要灵活(例如不能依靠括号的位置),因为有些条目之间有许多不同之处。
提前感谢您的任何想法!
发布于 2022-08-01 08:21:13
很难用模糊的要求提供一个完整的答案。您必须更清楚地说明哪些变化是可能的。
但是,这里有一个忽略大写、额外/缺失的数字符号(比如umlaut -假设字符没有ä -> a而不是ä -> ae)和空格的例子:
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中引入一些问题的,以及这如何不影响结果。输出:
['Aegirine', 'Barroisite', 'Cuprite', 'Pyrope', 'Rosasite']https://stackoverflow.com/questions/73189191
复制相似问题