Python 检查列表中的字符串是否存在于另一个嵌套列表中,并返回它';嵌套列表中的索引

Python 检查列表中的字符串是否存在于另一个嵌套列表中,并返回它';嵌套列表中的索引,python,string,python-2.7,nested-lists,Python,String,Python 2.7,Nested Lists,我有两个列表,一个普通列表和一个嵌套列表 list1 = ['john','amal','joel','george'] list2 = [['john'],['jack','john','mary'],['howard','john'],['jude']] 我想检查list1中的任何字符串是否存在于list2中,如果存在,则返回list2中字符串的索引(两个列表中都有)。 演示所需输出的示例代码如下所示: out = [(ind,ind2) for ind,i in enumerate(li

我有两个列表,一个普通列表和一个嵌套列表

list1 = ['john','amal','joel','george']
list2 = [['john'],['jack','john','mary'],['howard','john'],['jude']]
我想检查list1中的任何字符串是否存在于list2中,如果存在,则返回list2中字符串的索引(两个列表中都有)。 演示所需输出的示例代码如下所示:

out = [(ind,ind2) for ind,i in enumerate(list2) 
    for ind2,y in enumerate(i) if 'john' in y]
print out
它返回:
[(0,0)、(1,1)、(2,1)]

上面的代码确实输出了索引,但它仅限于我们手动输入的字符串。有可能按照我上面解释的那样做吗?任何帮助都将不胜感激。(对于嵌套列表来说是相当新的)。 谢谢

输出:

[(0, 0), (1, 1), (2, 1)]
输出:

[(0, 0), (1, 1), (2, 1)]

您可以简单地在列表1上循环:

list1 = ['john','amal','joel','george']
list2 = [['john'],['jack','john','mary'],['howard','john'],['jude']]

res = {}
for w in list1: # if list1 contains duplicates use set(list1) instead
    # create an empty list for the name of list1 and extend it by all finds or
    # extend it by None
    res.setdefault(w,[]).extend( [(ind,ind2) for 
              ind,i in enumerate(list2) for ind2,y in enumerate(i) if w in y] or [None] )

# print all results by name
for k in res:
    print k, res[k]

# print all dict
print res
输出:

amal [None]
joel [None]
john [(0, 0), (1, 1), (2, 1)]
george [None]

{'amal': [None], 'joel': [None], 'john': [(0, 0), (1, 1), (2, 1)], 'george': [None]}
{'amal': [], 'joel': [], 'john': [(0, 0), (1, 1), (1, 2)], 'george': []}

我在这里使用dict,因此您不会丢失列表中的哪个位置。

您可以简单地在列表1上循环:

list1 = ['john','amal','joel','george']
list2 = [['john'],['jack','john','mary'],['howard','john'],['jude']]

res = {}
for w in list1: # if list1 contains duplicates use set(list1) instead
    # create an empty list for the name of list1 and extend it by all finds or
    # extend it by None
    res.setdefault(w,[]).extend( [(ind,ind2) for 
              ind,i in enumerate(list2) for ind2,y in enumerate(i) if w in y] or [None] )

# print all results by name
for k in res:
    print k, res[k]

# print all dict
print res
输出:

amal [None]
joel [None]
john [(0, 0), (1, 1), (2, 1)]
george [None]

{'amal': [None], 'joel': [None], 'john': [(0, 0), (1, 1), (2, 1)], 'george': [None]}
{'amal': [], 'joel': [], 'john': [(0, 0), (1, 1), (1, 2)], 'george': []}

我在这里使用的是dict,因此您不会丢失列表中的哪个位置。

您可以使用嵌套列表理解:

[(i, j) for i, l in enumerate(list2) for j, s in enumerate(l) if s in list1]
#[(0, 0), (1, 1), (2, 1)]
请注意,首先将
list1
转换为
set
更有效:

set1 = set(list1)
[(i, j) for i, l in enumerate(list2) for j, s in enumerate(l) if s in set1]
#[(0, 0), (1, 1), (2, 1)]

您可以使用嵌套列表:

[(i, j) for i, l in enumerate(list2) for j, s in enumerate(l) if s in list1]
#[(0, 0), (1, 1), (2, 1)]
请注意,首先将
list1
转换为
set
更有效:

set1 = set(list1)
[(i, j) for i, l in enumerate(list2) for j, s in enumerate(l) if s in set1]
#[(0, 0), (1, 1), (2, 1)]

您还可以创建事件字典:

list1 = ['john','amal','joel','george']
list2 = [['john'],['jack','john','mary'],['howard','john'],['jude']]
new_d = {i:[(c, d) for d, a in enumerate(list2) for c, g in enumerate(a) if g == i] for i in list1}
输出:

amal [None]
joel [None]
john [(0, 0), (1, 1), (2, 1)]
george [None]

{'amal': [None], 'joel': [None], 'john': [(0, 0), (1, 1), (2, 1)], 'george': [None]}
{'amal': [], 'joel': [], 'john': [(0, 0), (1, 1), (1, 2)], 'george': []}

您还可以创建事件字典:

list1 = ['john','amal','joel','george']
list2 = [['john'],['jack','john','mary'],['howard','john'],['jude']]
new_d = {i:[(c, d) for d, a in enumerate(list2) for c, g in enumerate(a) if g == i] for i in list1}
输出:

amal [None]
joel [None]
john [(0, 0), (1, 1), (2, 1)]
george [None]

{'amal': [None], 'joel': [None], 'john': [(0, 0), (1, 1), (2, 1)], 'george': [None]}
{'amal': [], 'joel': [], 'john': [(0, 0), (1, 1), (1, 2)], 'george': []}

很抱歉,如果是的话,可能会重复,但我希望对此问题有一个全面的答案。我提供了一个示例代码,其输出是我希望得到的。他们想检查
list1
中的任何字符串是否包含在
y
中,否?除非我误解了什么,否则这个骗局是100%准确的。如果y中的'john',则用dupe->问题已解决的代码替换
。我不认为问题中有嵌套列表这一事实与dupe的适当性有什么关系。
out=[(ind,ind2)对于ind,i在枚举中(列表2)对于ind2,y在枚举中(i)如果有(x在y中对于列表1中的x)]
是否给您想要的输出?如果是,那么它是重复的。可能是重复的,如果是,我很抱歉,但我想对这个问题有一个全面的回答。我提供了一个示例代码,其输出是我希望得到的。他们想检查
list1
中的任何字符串是否包含在
y
中,否?除非我误解了什么,否则这个骗局是100%准确的。如果y中的'john',则用dupe->问题已解决的代码替换
。我不认为问题中有嵌套列表这一事实与dupe的适当性有什么关系。
out=[(ind,ind2)对于ind,i在枚举中(列表2)对于ind2,y在枚举中(i)如果有(x在y中对于列表1中的x)]
是否给您想要的输出?如果是,则它是重复的。如果OP想要所有事件的索引,而不是所有事件的索引,则是好的解决方案:)+1如果OP想要所有事件的索引,而不是所有事件的索引,则是好的解决方案:)+1