列表中单词的交集(只是出现在所有元素中的单词,而不是排序顺序)

时间:2015-09-09 11:30:36

标签: python-2.7

我需要提取list.append迭代创建的列表中所有元素共有的单词。我不希望拆分单词 - > sort - > count,因为如果单词模式是n-gram,那么我将对n-gram中的每个单词有相同的计数。 例如,在已知长度为二的列表中:

set(xy[0].split(' ')).intersection(set(xy[1].split(' ')))

如果我必须迭代任意长度,我会收到错误。我有set.intersection(set(ci) for ci in xy),它返回一个TypeError:描述符'交集'需要一套'对象但收到了一个'生成器'。在心理上,问题陈述是如何在迭代中找到所有元素的交叉词 ?非常感谢。抱歉,我仍然在FORTRAN中思考。

1 个答案:

答案 0 :(得分:1)

您可以使用*:

unpack
xy = [[1,2,3],[2,3]]
print(set.intersection(*(set(ci) for ci in xy)))
{2, 3}

或使用地图:

xy = [[1,2,3],[2,3]]
print(set.intersection(*map(set,xy)))
{2, 3}

如果您想维护订单,可以找到列表的交集并使用OrderedDict获取唯一值:

strs = ["prime minister David Cameroon,", "PM David Cameroon,", "David Cameroon, British prime minister"]

from collections import OrderedDict
inter = set.intersection(*map(set, map(str.split, strs)))

print(list(OrderedDict.fromkeys(v for v in strs[0].split() if v in inter).keys()))

['David', 'Cameroon,']

我们只需要迭代列表中的第一个分割子字符串,就像要出现在inter中的任何单词一样,它必须在所有三个中。

你可以使用list comp但是如果David或Cameroon在第一个字符串中出现多次,你最终会在输出列表中出现dupes,OrderedDict会确保你看到顺序并且只添加每个子字符串一次。如果您认为cameroon,Cameroon相同,您可能还需要考虑从单词中删除标点符号并调用较低的标点符号。