如何使用列表理解轻松获取“匹配”列表元素?例如我有一个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。欢迎您改进问题或标题。
答案 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))