在嵌套列表python中查找字符串及其索引的所有出现

Ama*_*ran 2 python nested-lists

我有一个以下格式的嵌套列表:

[['john'],['jack','john','mary'],['howard','john'],['jude']...]
Run Code Online (Sandbox Code Playgroud)

我想找到嵌套列表中出现的前 3 或 5 个 john 索引(因为列表真的很长)并返回索引,例如: (0,0),(1,1),(2,1) 或采用任何建议的格式。

我对嵌套列表相当陌生。任何帮助将非常感激。

Ant*_*vBR 6

问题 1:这是使用嵌套理解列表的一种方法。不过我会看看是否有骗子。

nested_list = [['john'],['jack','john','mary'],['howard','john'],['jude']]

out = [(ind,ind2) for ind,i in enumerate(nested_list) 
                  for ind2,y in enumerate(i) if y == 'john']

print(out)
Run Code Online (Sandbox Code Playgroud)

返回:[(0, 0), (1, 1), (2, 1)]


更新:这里发现了类似的内容Finding of an element in Nested Lists in python。然而,答案仅采用第一个值,可以将其转换为:

out = next(((ind,ind2) for ind,i in enumerate(nested_list) 
                       for ind2,y in enumerate(i) if y == 'john'),None)
print(out) # (0,0) 
Run Code Online (Sandbox Code Playgroud)

问题2:(来自评论)

y == 'john'是的,通过编辑到:非常容易'john' in y

nested_list = [['john xyz'],['jack','john dow','mary'],['howard','john'],['jude']]

out = [(ind,ind2) for ind,i in enumerate(nested_list) 
                  for ind2,y in enumerate(i) if 'john' in y]
print(out)
Run Code Online (Sandbox Code Playgroud)

返回:[(0, 0), (1, 1), (2, 1)]


问题3:(来自评论)

获取前 N 个元素的最有效方法是使用 python 库 itertools,如下所示:

import itertools

nested_list = [['john xyz'],['jack','john dow','mary'],['howard','john'],['jude']]

gen = ((ind,ind2) for ind,i in enumerate(nested_list) 
                       for ind2,y in enumerate(i) if 'john' in y)

out = list(itertools.islice(gen, 2)) # <-- Next 2
print(out)
Run Code Online (Sandbox Code Playgroud)

返回:[(0, 0), (1, 1)]

这里也回答了这个问题:How to take the front N items from agenerator or list in Python?


问题3延伸:

假设现在你想把它们分成 N 块,那么你可以这样做:

import itertools

nested_list = [['john xyz'],['jack','john dow','mary'],['howard','john'],['jude']]

gen = ((ind,ind2) for ind,i in enumerate(nested_list) 
                       for ind2,y in enumerate(i) if 'john' in y)

f = lambda x: list(itertools.islice(x, 2)) # Take two elements from generator

print(f(gen)) # calls the lambda function asking for 2 elements from gen
print(f(gen)) # calls the lambda function asking for 2 elements from gen
print(f(gen)) # calls the lambda function asking for 2 elements from gen
Run Code Online (Sandbox Code Playgroud)

返回:

[(0, 0), (1, 1)]
[(2, 1)]
[]
Run Code Online (Sandbox Code Playgroud)