0

可能重复:
返回列表中匹配条件的第一项

如何使用列表理解轻松获取“匹配”列表元素?例如,我有一个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语句中做同样的事情,以便匹配的列表元素可以用于进一步处理;像这样的东西:

>>> 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

4 回答 4

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将 raise StopIteration


如果您还想确保只有一个元素(或者对于某个固定的 N 正好有 N 个元素),您可以这样写(分配给一个元组):

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

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

也可以看看:

从匹配条件的可迭代项中获取第一项的最佳方法是什么?

于 2013-01-18T17:35:52.543 回答
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
于 2013-01-18T17:32:54.317 回答
0
>>> for each in lines:
...     match=re.search("(^NIT-Version-Default).*(v[0-9.]+)",each)
...     if match:
...             print match.group(2)
... 
v0.16.0
于 2013-01-18T17:40:22.517 回答
0

查看地图功能。相反,我没有看到理解的必要性:

map(lambda x: x.split('-')[-1].strip(),
        filter(lambda x: x.startswith('NIT'), lines)) 
于 2013-01-18T17:44:26.710 回答