在python中的嵌套列表中搜索

时间:2009-11-01 21:57:24

标签: python list nested search

我有一个清单:

l = [['en', 60, 'command'],['sq', 34, 'komand']]

我想搜索komandsq并返回l[1]

我可以以某种方式为列表搜索定义自己的匹配函数吗?

4 个答案:

答案 0 :(得分:11)

表达式如下:

next(subl for subl in l if 'sq' in subl)

将准确提供您正在搜索的子列表(如果没有此类子列表,则提升StopIteration;如果后者的行为不符合您的要求,请传递next第二个参数[[例如,[]None,取决于你想要什么!]]在这种情况下返回)。因此,只需使用此结果值,或将其指定为您希望的任何名称,依此类推。

当然,你可以轻松地将这个表达装扮成你喜欢的任何一种功能,例如:

def gimmethesublist(thelist, anitem, adef=None):
    return next((subl for subl in thelist if anitem in subl), adef)

但是如果你正在使用特定的变量或值,那么在线编码表达式往往更可取。

修改:如果您要搜索多个项目以查找包含任意一个(或更多)商品的子列表,

its = set(['blah', 'bluh'])
next(subl for subl in l if its.intersection(subl))

如果您想查找包含所有项目的子列表,

next(subl for subl in l if its.issubset(subl))

答案 1 :(得分:1)

你可以这样做:

def find(value, seq):
    for index, item in enumerate(seq):
        if value in item: 
            return index, item

In [10]: find('sq', [['en', 60, 'command'],['sq', 34, 'komand']])
Out[10]: (1, ['sq', 34, 'komand'])

或者如果您想要一般解决方案:

def find(fun, seq):
    for index, item in enumerate(seq):
        if fun(item): 
            return index, item

def contain(value):
    return lambda l: value in l

In [14]: find(contain('komand'), [['en', 60, 'command'],['sq', 34, 'komand']])
Out[14]: (1, ['sq', 34, 'komand'])

答案 2 :(得分:0)

如果您要做的只是返回包含任何值匹配的第一个列表,那么这将有效。

def search(inlist, matches):
    for li in inlist:
        for m in matches:
            if m in li:
                return li
    return None

>>> l = [['en', 60, 'command'],['sq', 34, 'komand']]
>>> search(l, ('sq', 'komand'))
['sq', 34, 'komand']

答案 3 :(得分:0)

是:

has_oneof = lambda *patterns: lambda: values any(p in values for p in patterns)
result = itertools.ifilter(has_oneof('komand', 'sq'), l).next()
print result # prints ['sq', 34, 'komand']