【问题标题】:Check if a string inside a list is present in another nested list and return it's index in nested list检查列表中的字符串是否存在于另一个嵌套列表中,并在嵌套列表中返回它的索引
【发布时间】:2018-04-07 10:09:05
【问题描述】:

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

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)]

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

【问题讨论】:

  • 如果是,我很抱歉,但我希望得到有关此查询的全面答案
  • 是的,我提供了一个示例代码,其输出是我希望得到的
  • 他们想检查list1 中的任何字符串是否包含在y 中,不是吗?除非我误解了什么,否则这个骗局是 100% 准确的。将 if 'john' in y 替换为来自欺骗的代码 -> 问题已解决。
  • 我看不出你的问题中有一个嵌套列表这一事实与欺骗的适当性有什么关系根本out = [(ind,ind2) for ind,i in enumerate(list2) for ind2,y in enumerate(i) if any(x in y for x in list1)] 是否给你想要的输出?如果是,那么它是重复的。

标签: python string python-2.7 nested-lists


【解决方案1】:

你可以简单地遍历list1:

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]}

我在这里使用的是字典,所以你不要弄乱列表中的哪个位置。

【讨论】:

  • 如果 OP 想要所有出现的索引而不是它们一起出现的索引,这是一个很好的解决方案 :) +1
【解决方案2】:
list1 = ['john','amal','joel','george']
list2 = [['john'],['jack','john','mary'],['howard','john'],['jude']]

res = []
for i, m in enumerate(list2):    #Iterate list2 
    for j, n in enumerate(m):    #Iterate nested list
        if n in list1:           #Check if element in list1
            res.append((i, j))   #Append index. 
print res

输出:

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

【讨论】:

    【解决方案3】:

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

    [(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)]
    

    【讨论】:

      【解决方案4】:

      您还可以创建一个出现次数的字典:

      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': [], 'joel': [], 'john': [(0, 0), (1, 1), (1, 2)], 'george': []}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-11
        • 2018-05-18
        • 2013-03-01
        相关资源
        最近更新 更多