查找列表的快速方法包含两个特定项目?

时间:2014-12-07 14:02:55

标签: python

我有一个列表(大约200个)包含不同的字符串:

lists = [
  ['a', 'b', 'c', 'g', ...],
  ['b', 'c', 'f', 'a', ...],
  ...
]

现在我想查找包含两个给定字符串的所有列表,按给定顺序

例如,给定('a', 'g')['a', 'b', 'c', 'g', ...]将匹配。

这样做的pythonic方式是什么?

1 个答案:

答案 0 :(得分:1)

在我看来,最恐怖的方式是:

selection = [L for L in lists
             if x1 in L and x2 in L and L.index(x1) < L.index(x2)]

缺陷是它将搜索每个元素两次,首先检查存在(忘记索引),然后检查排序。

另一种选择可能是

def match(a, b, L):
    try:
        return L.index(a) < L.index(b)
    except ValueError:
        return False

selection = [L for L in lists if match(x1, x2, L)]

但是我发现它有点丑陋,除非性能有问题否则我不会使用它。

如果所需的逻辑是接受包含[... x2 ... x1 ... x2 ...]的列表,则检查不同:

selection = [L for L in lists
             if x1 in L and x2 in L[L.index(x1)+1:]]
如果x1x2是相同的值,那么翻译为英语为“如果x1在列表中,而x2是第一个x1之后的部分”,它也会按预期工作。