改进python中的成员比较

改进python中的成员比较,python,Python,我试图从一篇杂志文章中提取所有的名字和姓氏(我称之为example.txt)。我分两部分来做 在第一部分中,我提取了一个由两个单词组成的字符串,每个单词都以大写字母开头,中间有一个空格,我使用正则表达式来实现这一点。我将所有这些字符串列成一个列表,并将此列表称为all\u name。这给了我所有可能的名字,比如“巴拉克·奥巴马”,还有“总统” 在第二部分中,我拆分字符串并取每个名字的第一部分,比如“巴拉克·奥巴马”中的“巴拉克”,我想检查“巴拉克”是否在我提前准备的名字列表中(我称之为first

我试图从一篇杂志文章中提取所有的名字和姓氏(我称之为
example.txt
)。我分两部分来做

在第一部分中,我提取了一个由两个单词组成的字符串,每个单词都以大写字母开头,中间有一个空格,我使用正则表达式来实现这一点。我将所有这些字符串列成一个列表,并将此列表称为
all\u name
。这给了我所有可能的名字,比如“巴拉克·奥巴马”,还有“总统”

在第二部分中,我拆分字符串并取每个名字的第一部分,比如“巴拉克·奥巴马”中的“巴拉克”,我想检查“巴拉克”是否在我提前准备的名字列表中(我称之为
first\u names.txt
)。如果存在匹配项,并且只有存在匹配项,那么我将其添加到一个新数组中,该数组应该只有那些与
first\u names.txt
中的名称匹配的名称

因此,理论上,“巴拉克·奥巴马”进入阵营,“总统”没有。不幸的是,来自“总统”的子字符串“the”出现在诸如“Matthew”和“Katherine”这样的名字中,因此“总统”也会出现在数组中,尽管我不希望它出现。我的代码如下。对如何解决这个问题有什么建议吗

import re 

text = open('example.txt').read()
first_names = open('first_names.txt').read()
regex = re.compile("[A-Z][a-z]+\s[A-Z][\w]*") 
all_names = regex.findall(text)
array = []

for name in all_names:
  first = name.split(" ")[0]
  if first in first_names:
    if name not in array:
      array.append(name)
print(array)

您可以拆分
名字
并创建这些名字的
集合
(假设文件中的名字用空格分隔):

然后,
if first in first_names
将在O(1)时间内检查确切的名字是否在该集合中。这也将解决排除“总统”的问题,因为“总统”的名字将返回
False

下面是一个简单的例子:

first_names_text = "Barack Matthew Katherine"

first_names = set(first_names_text.split())
all_names = ['Barack Obama', 'The President', 'Katherine Swift']

array = []
for name in all_names:
    first = name.split(" ")[0]
    if first in first_names:
        if name not in array:
            array.append(name)

print(array) 
# ['Barack Obama', 'Katherine Swift']
first_names_text = "Barack Matthew Katherine"

first_names = set(first_names_text.split())
all_names = ['Barack Obama', 'The President', 'Katherine Swift']

array = []
for name in all_names:
    first = name.split(" ")[0]
    if first in first_names:
        if name not in array:
            array.append(name)

print(array) 
# ['Barack Obama', 'Katherine Swift']