我可以让Python比较昵称列表和全名列表吗?

2024-04-19 14:26:21 发布

您现在位置:Python中文网/ 问答频道 /正文

首先,我有一个字符数据框,它有一个名为name的列,包含100多人的全名

姓名:约翰纳森·杰伊·史密斯、哈罗德·罗伯特·多伊、凯蒂·霍尔特

然后我有一个独特的昵称列表,例如,[多伊先生,凯蒂阿姨,约翰]

重要的是要注意,它们的顺序不同,并非所有有昵称的人都在全名列表中,也并非所有全名列表中的人都在昵称列表中。我将删除最后没有匹配值的行

我的问题:有没有一种方法可以让python逐项阅读这两个列表,并为每个匹配的人将John与Johnathan Jay Smith进行匹配?基本上,如果昵称作为整个名称的一部分出现,我是否可以在现有的字符数据框中添加昵称列,而不必为100多人手动执行此操作

提前谢谢你,我甚至不知道从哪里开始这一个


Tags: 数据方法name名称列表顺序手动字符
1条回答
网友
1楼 · 发布于 2024-04-19 14:26:21

这是非常直截了当的,不考虑拼写变体

from itertools import product

names = ['Johnathan Jay Smith', 'Harold Robert Doe', 'Katie Holt']
nicknames = ["Mr. Doe", "Aunt Katie", "John"]

def match_nicknames(names, nicknames):
    splitted_names = [n.split(' ') for n in names]
    splitted_nn = [n.split(' ') for n in nicknames]
    matches = []
    for name in splitted_names:
        name_pairs = product(name, splitted_nn)
        matched = filter(lambda x: any([nn in x[0] for nn in x[1]]), name_pairs)
        if matched:
            matches += [(" ".join(name), " ".join(nn)) for name_part, nn in matched]
    return matches

match_nicknames(names, nicknames)
>> [('Johnathan Jay Smith', 'John'),
    ('Harold Robert Doe', 'Mr. Doe'),
    ('Katie Holt', 'Aunt Katie')]

相关问题 更多 >