Python 将字符串列表转换为数字向量以计算汉明距离

Python 将字符串列表转换为数字向量以计算汉明距离,python,Python,我有一个独特的单词列表。我必须计算两列字符串之间的汉明距离。假设字符串列表为: a = ['a' , 'b', 'c' ] b = ['b' , 'a', 'd' ] 让独特的单词列表为: u = ['a', 'b', 'c', 'd', 'e'] 我需要从a和b创建两个与u长度相同的列表。假设列表是va和vb。va和vb的每个元素将是0或1。如果u的相应元素存在于a或b中,则为1,否则为0。比如说, va = [1, 1, 1, 0, 0] vb = [1, 1, 0, 1, 0] 然后

我有一个独特的单词列表。我必须计算两列字符串之间的汉明距离。假设字符串列表为:

a = ['a' , 'b', 'c' ]
b = ['b' , 'a', 'd' ]
让独特的单词列表为:

u = ['a', 'b', 'c', 'd', 'e']
我需要从
a
b
创建两个与
u
长度相同的列表。假设列表是
va
vb
va
vb
的每个元素将是
0
1
。如果
u
的相应元素存在于
a
b
中,则为
1
,否则为
0
。比如说,

va = [1, 1, 1, 0, 0]
vb = [1, 1, 0, 1, 0]
然后,我将使用sklearn的成对距离度量计算
va
vb
之间的汉明距离。从
a
b
u
计算
va
vb
最有效的方法是什么?

尝试以下方法:

sa=set(a)
sb=set(b)    
va=list(map(lambda x: 1 if x in sa else 0, u))
vb=list(map(lambda x: 1 if x in sb else 0, u))

>>> print(va)
[1, 1, 1, 0, 0]
>>> print(vb)
[1, 1, 0, 1, 0]

使用列表理解比使用
列表(映射(..)
组合更快:

a = ['a' , 'b', 'c' ]
b = ['b' , 'a', 'd' ]

u = ['a', 'b', 'c', 'd', 'e']

sa=set(a)
sb=set(b)

va = [1 if x in sa else 0 for x in u]
vb = [1 if x in sb else 0 for x in u]

print(va)
print(vb)
输出:

[1, 1, 1, 0, 0]
[1, 1, 0, 1, 0]
[1, 1, 1, 0, 0]
让我们衡量一下:

from timeit import timeit

print("map", timeit( lambda: list(map(lambda x: 1 if x in sa else 0, u)) )) 
print("list-comp", timeit( lambda: [1 if x in sa else 0 for x in u]))
看到这一点

map 41.271170677
list-comp 17.18380836300000  ( about 42% of the time map uses)

您可以使用以下列表组件:

a = ['a' , 'b', 'c' ]
u = ['a', 'b', 'c', 'd', 'e']

a = set(a)
[int(i in a) for i in u]
输出:

[1, 1, 1, 0, 0]
[1, 1, 0, 1, 0]
[1, 1, 1, 0, 0]

如果x在另一个0中,是否为
1
O(len(a))
?您能告诉我这种方法的时间复杂度吗?我认为是O(len(u)),因为所有u元素都必须检查更改为set,因为检查项是否在set中比检查列表快得多