在IF语句中使用列表理解

时间:2013-01-18 17:29:48

标签: python list-comprehension

  

可能重复:
  Return the first item in a list matching a condition

如何使用列表理解轻松获取“匹配”列表元素?例如我有一个list,我正在寻找一个以某个字符串开头的元素。这很容易做到:

>>> lines = ['AHP Buildlife number', 'NIT-Version-Default-v0.16.0', 'E_release v2.3.14.0']
>>> [ x.strip() for x in lines if x.startswith('NIT-Version-Default') ]
['NIT-Version-Default-v0.16.0']

但是我怎么能在if语句中做同样的事情,以便匹配的list-element可以用于进一步处理;这样的事情:

>>> if [ x.strip() for x in lines if x.startswith('NSS-Checkin-Default') ]:
...   ver = x.split('-')[-1].strip()
...   print ver

因此,它返回v0.16.0作为版本号。这显然不起作用,但希望你明白我正在尝试做什么。知道怎么做吗?干杯!!

PS。欢迎您改进问题或标题。

4 个答案:

答案 0 :(得分:2)

如果您只想找一个元素:

x = next(x.strip() for x in lines if x.startswith('NSS-Checkin-Default'))
ver = x.split('-')[-1].strip()

请注意,我使用了生成器表达式(a for b in c if d),而不是列表推导[a for b in c if d]。这样,lines上的迭代只会在实际需要的时间内完成(在这种情况下,直到找到第一个元素)。

如果未找到任何元素,next将引发StopIteration


如果你还想确保完全一个元素(或某些固定N的N个元素),你可以这样写(分配给一个元组):

(x,) = (x.strip() for x in lines if x.startswith('NSS-Checkin-Default')

在这种情况下,如果生成器表达式产生的元素太少或太多,您将拥有ValueError。这称为“元组解包”。

另见:

What is the best way to get the first item from an iterable matching a condition?

答案 1 :(得分:0)

简单:列表推导返回一个包含一个元素的列表,因此您只需访问该元素:thelist[0]

从你的例子中取出:

lines = ['AHP Buildlife number', 'NIT-Version-Default-v0.16.0', 'E_release v2.3.14.0']
results = [ x.strip() for x in lines if x.startswith('NIT-Version-Default') ]
ver = results[0].split('-')[-1].strip()
print ver

答案 2 :(得分:0)

>>> for each in lines:
...     match=re.search("(^NIT-Version-Default).*(v[0-9.]+)",each)
...     if match:
...             print match.group(2)
... 
v0.16.0

答案 3 :(得分:0)

请参阅map功能。我没有看到理解的必要性,而是:

map(lambda x: x.split('-')[-1].strip(),
        filter(lambda x: x.startswith('NIT'), lines))