从2个列表中提取类似字符串的Python代码

从2个列表中提取类似字符串的Python代码,python,string,for-loop,if-statement,Python,String,For Loop,If Statement,我有两份来自两个不同来源的球员名单 names1=['C.J.麦克科伦','Metta World','LeBron James','Stephen Curry'] names2=['Metta World Peace','Steph Curry','Kevin Durant','CJ McCollum'] 这里的问题是,虽然他们是相同的玩家,但在两个来源中提到他们名字的方式有一些不同。我使用以下代码查找相似的名称(names1中的所有字符都应该存在于names2中): 对于names1的每次迭

我有两份来自两个不同来源的球员名单

names1=['C.J.麦克科伦','Metta World','LeBron James','Stephen Curry']

names2=['Metta World Peace','Steph Curry','Kevin Durant','CJ McCollum']

这里的问题是,虽然他们是相同的玩家,但在两个来源中提到他们名字的方式有一些不同。我使用以下代码查找相似的名称(
names1
中的所有字符都应该存在于
names2
中):

对于
names1
的每次迭代,输入
names2
所有迭代中的代码,并输出与
names2
中的条目相似的条目索引
idx
是一个应该包含类似字符串索引的列表
i
idx
的索引。每次找到类似的字符串时,它都存储在
idx
中,
i
增加1,以便找到的下一个条目将记录在
idx
的索引
i+1

预期答复:
idx
=[0,1,3]

但是,我得到以下错误:
列表分配索引超出范围


如何修复代码?有没有更好的方法解决此问题?

由于z:中的y出现错误,您可以在w:中使用y: 您还可以在比较之前进行一些格式化,如删除“.”,然后可以使用任何字符串相似性算法(如Levenshtein distance)查找相似的字符串, “pip安装python Levenshtein”

将numpy导入为np
将Levenshtein作为ld导入
名称1=['C.J.麦克科伦','Metta世界和平','LeBron James','Stephen
咖喱']
名称2=['Metta World Peace','Steph Curry','Kevin Durant','CJ McCollum']
idx=np.零(3)
i=0
相似性指数=3
对于枚举中的x,y(名称1):
y=y。替换('.','')
对于枚举中的z,w(名称2):
w=w.替换('.','')
如果ld.距离(y,w)<相似性指数:
idx[i]=x
i=i+1
打印(idx)
 > < P>这里是一个尝试(这里我认为只有M.C= MC,Mulcule和Mulcule的使用,和LevsHein距离小于2的变化被接受来考虑两个名称是相同的):

将numpy导入为np
def levenshtein_距离(v,w):
n、 m=长(v),长(w)
M=np.零((n+1,M+1))
对于范围(n+1)内的i:
M[i,0]=i
对于范围(m+1)内的j:
M[0,j]=j
对于范围(1,n+1)内的i:
对于范围(1,m+1)内的j:
如果v[i-1]==w[j-1]:
M[i,j]=min(M[i-1,j]+1,M[i,j-1]+1,M[i-1,j-1])
其他:
M[i,j]=min(M[i-1,j]+1,M[i,j-1]+1,M[i-1,j-1]+1)
返回M[n,M]
def norm_名称(x):
#可以在此处添加更多名称
返回x.replace(“.”,“”)。lower()
名称1=['C.J.McCollum','Metta World Peace','LeBron James','Stephen Curry']
名称2=['Metta World Peace','Steph Curry','Kevin Durant','CJ McCollum']
名称1=列表(映射(标准名称,名称1))
名称2=列表(映射(标准名称,名称2))
指数=[]
对于i,枚举中的名称(名称1):
对于names2中的name2:

索引+=[i]如果levenshtein_距离(name,name2)即使没有错误,结果也将是一个空数组或全零,我认为你在寻找w
中的
y,关于你的问题,如果没有一些基本规则来指出我的错误,我不认为找到类似字符串的一般解决方案。我已经更新了我的问题。(对于给您带来的不便,我深表歉意,我对堆栈溢出还是个新手)对于这些我已经提到过的算法,可以使用Levenshtein距离来计算字符串之间的相似性,一些阈值距离值可以被设置成类似的字符串。如果你在你的答案中张贴了这个效果,这对Steph Curry和斯蒂芬·库里来说是更好的吗?YEP,你可以在这里玩LevsHeTin距离。
idx = np.zeros(3)
i = 0
for x, y in enumerate(names1):
    for z, w in enumerate(names2):
        if y in w:
            idx[i] = x
            i = i+1
import numpy as np
import Levenshtein as ld

names1 = ['C.J. McCOllum', 'Metta World Peace', 'LeBron James', 'Stephen 
Curry']

names2 = ['Metta World Peace', 'Steph Curry', 'Kevin Durant', 'CJ McCollum']
idx = np.zeros(3)
i = 0
similarity_index =3
for x, y in enumerate(names1):
y=y.replace('.','')

for z, w in enumerate(names2):
    w= w.replace('.','')
    if ld.distance(y,w) < similarity_index:
        idx[i] = x
        i = i+1


 print(idx)