Python 如何检查同一索引中的列表中是否存在字符串

Python 如何检查同一索引中的列表中是否存在字符串,python,python-2.7,list,for-loop,Python,Python 2.7,List,For Loop,我想逐字比较列表中是否存在该单词 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:

我想逐字比较列表中是否存在该单词

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
中,但我不希望这样。请注意,我希望通过比较同一索引中的项目,逐个比较
项目
aa
中的单词

至于items中的第三项,它将打印出
jackson
,尽管与
michael jackson
相比,只有
jackson
存在

请注意,aa中第三项的结果应仅为“jackson”,而不是“jackson”、“nintendo”,因为列表应在同一索引内进行比较。项目的第三个索引是“迈克尔·杰克逊”,没有“任天堂”m,因此结果应该是“杰克逊”

第一项匹配“michael”和“jackson”,因此我希望结果将它们打印在一行中,以便结果中的索引与项的索引相对应。因为如果我继续进行最初的预期结果,我意识到“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 
产出(预期):


更容易。迭代两个列表,然后迭代迭代变量:)


每对短语中输出单词的顺序重要吗?换句话说,第一个“迈克尔”和“杰克逊”应该按这个顺序出现吗?如果这一点很重要,那么该解决方案是可行的,尽管它不是非常有效:

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%。

为什么要分别比较“michael”和“jackson”?我相信这正是您想要的。我将在斯坦福依赖项解析器中应用这一点,它将为我提供一个字一个字的输出。因此,我必须进行比较individually@Lily在这种情况下,请修改您的问题以澄清这一点。在Python2.7中,此代码甚至不运行…@G\M It-is。对OP:你建议不要使用
split
,但还是自己使用?@Black Thunder我是通过运行你的代码得到这个错误的“列表”对象没有“拆分”属性。但是,我必须将其压缩在一起,因为我的真实数据要比这个大得多,并且在“项目”列表中会有重复项。如果我不压缩列表,它们就不会按相同的顺序进行比较index@DYZ在我发表评论后,答案被编辑了大约三次。@BlackThunder最初,我认为这是解决方案,但这并没有比较同一索引中的项目。因为当我将aa中的第三项改为“我爱杰克逊任天堂”时,结果也会打印出“任天堂”,虽然任天堂不在itemsHow中的第三项中,但我可以用这个来比较列表中的项目吗?比较y值。Y是两个列表中的每一个列表项的迭代形式。@Lily我已经修改了我的答案,使之更精确。我已经尝试了新代码,但它仍然不是我想要的。使用“in”也是我最初解决方案中的问题。因为当我用y中的“if't”测试你的代码时,我的预期结果是“”(没有),因为在你的列表中,没有“t”。但是您的解决方案返回“test”、“testing”、“tester”、“tested”,因为“t”只存在于allHmm中。我知道另一种方法,但不太好笑。我会再次检查我的方法。很抱歉那样浪费你的时间。订单不重要。我尝试了第一种解决方案,它似乎给了我想要的结果。但是你能不能用正常的for循环来解释,而不是列表理解。因为我将在实际数据(standford解析器)中处理更多for循环,因此我希望更多地了解您的解决方案。我对列表的理解力很弱@迪兹
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']