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中比检查列表快得多