我想逐字比较该词是否存在于列表中。
items=["michael jackson","nintendo", "michael jackson"]
aa = ["i think michael jackson is cool","i love nintendo","i miss jackson nintendo"]
for i, a in zip(items, aa):
token=a.split()
for x in token:
if x in i:
print "X: " + x
输出:
X: i
X: michael
X: jackson
X: i
X: nintendo
X: i
X: jackson
预期产出:
X: michael X: jackson #from "i think michael jackson is cool"
X: nintendo #from i love nintendo"
X: jackson #from "i miss jackson nintendo"
如您所见,i
也被打印出来,因为i
在michael
和nintendo
,但我不希望这样。请注意,我想通过比较同一索引中的项目来比较items
和aa
中的单词。
至于项目中的第3项,它将打印出jackson
尽管与michael jackson
相比时只有jackson
存在。
请注意,aa 中第 3 项的结果应该只是"杰克逊",而不是"杰克逊"、"任天堂",因为列表应该在同一索引内进行比较。 项目中的第 3 个索引是"迈克尔杰克逊",没有"任天堂"m 因此结果应该只有"杰克逊"。
第一项与"迈克尔"和"杰克逊"匹配,因此我希望结果将它们打印在一行中,以便结果中的索引对应于项目的索引。因为如果我继续执行原始预期结果,我意识到"aa"中项目的顺序将丢失。意思是说,我不知道"迈克尔杰克逊"是从"aa"中的第一项中提取的
它非常简单。尝试:
items=["michael jackson","nintendo", "michael jackson"]
aa = ["i think michael jackson is cool","i love nintendo","i miss jackson nintendo"]
output,string = [],""
for xx,yy in zip(aa,items):
item = yy.split(" ")
for x in xx.split(" "):
if x in item:
string += "X: " + x + " "
if string != "":output.append(string)
string= ""
#printing data
for item in output:print item
输出(预期(:
X: michael X: jackson
X: nintendo
X: jackson
每对短语中输出单词的顺序重要吗?换句话说,第一个"迈克尔"和"杰克逊"应该按这个顺序出现吗?如果它很重要,这个解决方案是有效的,尽管它不是很有效:
from itertools import chain
list(chain.from_iterable([x for x in s1.split() for y in s2.split() if x==y]
for s1,s2 in zip(aa, items)))
#['michael', 'jackson', 'nintendo', 'jackson']
如果顺序不重要,可以计算集合交集:
list(chain.from_iterable(set(s1.split()) & set(s2.split())
for s1,s2 in zip(aa, items)))
#['jackson', 'michael', 'nintendo', 'jackson']
第二种解决方案的速度提高了约 20%。
甚至更容易。迭代两个列表,然后迭代迭代变量:)
l1=["michael jackson","nintendo", "michael jackson"]
l2 = ["i think michael jackson is cool","i love nintendo","i miss jackson nintendo"]
for x in l1:
for y in x.split():
if y in x:print('X: '+y)