优雅的方法来过滤列表

5

我有两个列表,如下所示。我需要从后面的等号中提取值,例如xyz和.81。 我正在尝试制作一个通用解决方案用于这两个列表或者未来的列表。 目前,我正在使用列表连接和查找,然后拆分。但是我觉得还有更好的方法可以实现。

a = ['.TITLE', "'=", 'xyz', 'vdd', '=', '0.81', 'temp', "-40'"]
b = ['.TITLE', "'$", 'abc', '=', 'xyz', 'vdd', '=', '0.99', 'temp', "125'"]

'0.99'也应该包括在内吗? - thebjorn
3个回答

6

您可以使用生成器和next()函数:

a = ['.TITLE', "'=", 'xyz', 'vdd', '=', '0.81', 'temp', "-40'"]
a1 = iter(a)
for item in a1:
    if '=' in item:
        print next(a1)

输出:

xyz
0.81

请注意,如果=是最后一个项目,这将引发一个StopIteration错误。
你也可以使用enumerate():
a = ['.TITLE', "'=", 'xyz', 'vdd', '=', '0.81', 'temp', "-40'"]
for i, j in enumerate(a):
    if '=' in j:
        print a[i+1]

输出:

xyz
0.81

如果=是最后一项,再次执行此操作将引发错误(IndexError)。


4
作为一个函数:
import itertools

def extract_items_after(lst, marker='='):
    for x, y in itertools.izip_longest(lst, lst[1:]):
        if marker in x:
            yield y

使用您的数据:

a = ['.TITLE', "'=", 'xyz', 'vdd', '=', '0.81', 'temp', "-40'"]
b = ['.TITLE', "'$", 'abc', '=', 'xyz', 'vdd', '=', '0.99', 'temp', "125'"]

for l in [a, b]:
    print list(extract_items_after(l))

结果:

>>> 
['xyz', '0.81']
['xyz', '0.99']

1
美观且不会引发任何异常。 - ychaouche

0
一种不太优雅的方法是使用标志:
a = ['.TITLE', "=", 'xyz', 'vdd', '=', '0.81', 'temp', "-40'"]
b = ['.TITLE', "'$", 'abc', '=', 'xyz', 'vdd', '=', '0.99', 'temp', "125'"]

def extract(L,sep="="):
    pick_this_one = False
    for item in L :
        if pick_this_one:
            pick_this_one = False
            yield item
        if item == sep :
            pick_this_one = True

for value in extract(a+b):
    print value

>>> xyz
0.81
xyz
0.99
>>> 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接