在多维列表中搜索字符串,并将包含匹配的子列表附加到空列表

时间:2011-12-29 03:44:20

标签: python list iterator

我有一个类似于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段。

3 个答案:

答案 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]]