【问题标题】:Convert a list of strings to numeric vector to calculate hamming distance将字符串列表转换为数值向量以计算汉明距离
【发布时间】:2020-10-10 16:42:34
【问题描述】:

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

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

让唯一词列表为:

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

我需要从ab 创建两个与u 长度相同的列表。假设列表是vavbvavb 的每个元素将是 01。如果u 的对应元素存在于ab 中,则为1,否则为0。例如,

va = [1, 1, 1, 0, 0]
vb = [1, 1, 0, 1, 0]

然后,我将使用 sklearn 的成对距离度量来计算 vavb 之间的汉明距离。从abu 计算vavb 的最有效方法是什么?

【问题讨论】:

    标签: python


    【解决方案1】:

    使用列表推导比使用list(map(..)) 组合更快:

    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]
    

    让我们测量一下:

    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)
    

    【讨论】:

      【解决方案2】:

      试试这个:

      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]
      

      【讨论】:

      • 1 if x in a else 0 还是O(len(a))
      • 你能告诉我这种方法的时间复杂度吗?
      • 我认为它是 O(len(u)) 因为必须检查所有 u 元素
      • 更改为设置,因为检查项目是否在设置中比检查列表更快
      【解决方案3】:

      你可以使用下面的listcomp:

      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]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-23
        • 2013-07-28
        • 1970-01-01
        • 2016-09-21
        • 2014-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多