将函数应用于列表的任何两个元素 - Python

时间:2014-04-06 06:10:21

标签: python string list

我有一个函数来计算两个解析字符串的jaccard索引。该功能正常,其代码如下:

def jack(a,b):
    x=a.split()
    y=b.split()
    k=float(len(list(set(x)&set(y))))/float(len(list(set(x) | set(y))))
    return k

但是,当我想将该函数应用于列表的任何两个元素时,会出现错误。我的名单叫做“a”,就像这样:[[“Coca Cola”],[“Coca Sc”]]。错误消息是:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-51-0d7031267380> in <module>()
----> 1 jack(a[2],a[3])

<ipython-input-27-256123b04a44> in jack(a, b)
      1 def jack(a,b):
----> 2     x=a.split()
      3     y=b.split()
      4     k=float(len(list(set(x)&set(y))))/float(len(list(set(x) | set(y))))
      5     return k

AttributeError: 'list' object has no attribute 'split'

我知道这是因为[2]也是一个列表,但我想找到一种方法来处理这个以获得预期的输出。也许我可以修改我的功能或输入输出的方式。

2 个答案:

答案 0 :(得分:2)

由于您有一个元素列表,并且您将列表作为参数传递,而您的函数需要字符串,我建议您像这样调用您的函数

jack(a[2][0], a[3][0])

此外,您无需将set转换为list即可找到长度。

return float(len(set(x) & set(y))) / float(len(set(x) | set(y)))

应该就够了。

答案 1 :(得分:1)

这是因为你的变量a是一个嵌套列表。您应该展平a或将参数传递为:

jack(a[2][0],a[3][0])

或者,您可以将列表展平为:

a = [i[0] for i in a]

然后你可以很容易地做到:

jack(a[0],a[1])