python 测试子字符串是否在列表中的所有项目中

python test if substring in all item in a list

我想像所有 all() 一样进行比较,以测试我的子字符串是否在列表中的每个元素中。

一些虚拟数据:

my_list = ['~/.tmp/myproject/filea', '~/.tmp/myproject/fileb']

我想测试 .tmp/myproject/ 是否在此列表中的每个项目中。

all(['mysubstring' in item for item in my_list])

列表理解可能是进行这种检查的最佳方式,最重要的是您仍然可以使用 all!

Python 2.7.6 (default, Mar 22 2014, 22:59:56)
Type "help", "copyright", "credits" or "license" for more information.
>>> my_list = ['~/.tmp/myproject/filea', '~/.tmp/myproject/fileb']
>>> my_list
['~/.tmp/myproject/filea', '~/.tmp/myproject/fileb']
>>> [item for item in my_list]
['~/.tmp/myproject/filea', '~/.tmp/myproject/fileb']
>>> ['/.tmp/myproject/' in item for item in my_list]
[True, True]
>>> all(['/.tmp/myproject/' in item for item in my_list])
True

一些时间准确地说明了您应该使用生成器表达式的原因:

In [25]:  l = ["foobar" for _ in range(100000)]

In [26]:  l = ["foobar" for _ in range(100000)]

In [27]: l =  ["doh"] + l

In [28]: timeit all("foo" in s for s in l)
1000000 loops, best of 3: 541 ns per loop

In [29]: timeit all(["foo" in s for s in l])
100 loops, best of 3: 6.49 ms per loop

这里有一些关于如何使用生成器及其优点的很好的例子wiki.python.org/moin/Generators

我认为一个好的经验法则是,如果您只打算使用生成一次的元素集,或者数据太大而无法放入内存,请使用生成器表达式。如果你想再次使用这些元素并且大小合适,那么将它们存储在一个列表中。