我有一个类似于this question的问题,但我的问题涉及多维数据列表:
myList = [['abc', 'abc-321'], ['def', '789-abc'], ['xyz', 'xyz-123']]
newList = []
我想在myList中搜索某个单词/短语,如果有匹配项,则会搜索要附加到newList的整个子列表,以及用元素控制的方法
例如,如果我在每个子列表的第一个和第二个元素中搜索tern'abc',newList应该是(两个匹配):
[['abc', 'abc-321'], ['def', '789-abc']]
但是如果只搜索第一个元素,newList应该是(只有一个匹配):
[['abc', 'abc-402']]
如何以最有效的方式进行两种类型的搜索?请考虑一下:要搜索的列表包含大约一千个子列表,要搜索的文本平均约为1-2段。
答案 0 :(得分:1)
试试这个
def foo(myList,key,first=True):
if first: #First Element Search
return [x for x in myList if key in x]
else: #Search Both Element
return [x for x in myList if key in x or key in x[1]]
>>> foo(myList,'abc',0)
[['abc', 'abc-321']]
>>> foo(myList,'abc',1)
[['abc', 'abc-321'], ['def', '789-abc']]
注意:这只是利用了列表理解。唯一需要注意的是比较。将两个字符串与in
进行比较将尝试匹配第二个字符串中任何位置的第一个字符串。将字符串与列表进行比较,它将尝试匹配字符串第一个元素中任意位置的第一个字符串。
更简单的实施
def foo(myList,key,first=True):
return [x for x in myList if key in x or not first and key in x[1]]
>>> foo(myList,'abc')
[['abc', 'abc-321']]
>>> foo(myList,'abc',first=False)
[['abc', 'abc-321'], ['def', '789-abc']]
>>> foo(myList,'abc',first=True)
[['abc', 'abc-321']]
答案 1 :(得分:1)
或:
def bar(L, S):
return list( v for v in L if any(S in s for s in v) )
答案 2 :(得分:0)
[lst for lst in myList if any('abc' in s for s in lst)]
如果只搜索第一个元素:
[lst for lst in myList if 'abc' in lst[0]]