在列表列表中搜索元素

时间:2014-08-11 08:46:10

标签: python list search

我有一个包含以下形式元素的列表:

[['37a1', 1], 153, 160, [[13, 2], [53, -1], [67, 2], [127, -1], [443, -1], [547, 2], [599, -1]]]
[['57a1', 1], 155, 157, [[5, 2], [11, -1]]]
[['198a1', 1], 156, 156, []]
[['551c1', 1], 155, 158, [[5, 5], [43, -1], [149, -1]]]

如何搜索列表中的元素,使[anything,-1]成为我元素的一部分?在这种情况下,前两个和最后一个元素应该作为我的答案返回。

我知道如何在列表中仅提取一个与['37a1',1]匹配的元素,例如:

matches = [x for x in regs if ['37a1', 1] in x]; matches

我猜测基于此,我应该做一些与上述非常相似的事情,但用['37a1', 1]代替表示任何事情'。另一个例子,我希望能够在我的元素中搜索[anything,5],并将此列表中的最后一个元素作为输出返回。

2 个答案:

答案 0 :(得分:2)

我假设你想测试每个列表的 last element 中的子列表,而不是前3个元素。

您需要针对每个嵌套列表中的每个元素进行测试;使用any()可以提高效率:

[x for x in regs if any(sub[1] == -1 for sub in x[-1])]

any()测试循环生成器表达式,直到找到True值,此时它停止迭代并返回True。这意味着只有x中的第二个元素等于x[-1]的子列表才会包含-1

答案 1 :(得分:2)

这适用于任意嵌套列表:

def has_items(m):
    for x in m:
        if isinstance(x, list):
            if not isinstance(x[0], list):
                if len(x) == 2 and x[1] == -1: return x
            elif has_items(x): return x
    return False


print has_items(reversed(m))