2013-08-17 88 views
2

使用耐心排序计算最长的递增子序列我创建了一个(值,反向链接)对的嵌套元组,然后我需要爬取才能获得所有的值。 目前我使用一个小功能来做到这一点,但想知道是否有一种方法来使用列表解析来做同样的事情。使用列表理解从嵌套Python数据结构中获取值列表?

该示例使用namedtuple在我原来的计划,并应说明我的问题:

>>> from collections import namedtuple 
>>> P = namedtuple('P', 'val, back') 
>>> q = P(val=15, back=P(val=11, back=P(val=9, back=P(val=6, back=P(val=2, back=P(val=0, back=None)))))) 
>>> q 
P(val=15, back=P(val=11, back=P(val=9, back=P(val=6, back=P(val=2, back=P(val=0, back=None)))))) 
>>> #Request something like: 
>>> [val for val, q in q] 
Traceback (most recent call last): 
    File "<pyshell#68>", line 1, in <module> 
    [val for val, q in q] 
    File "<pyshell#68>", line 1, in <listcomp> 
    [val for val, q in q] 
TypeError: 'int' object is not iterable 
>>> q 
P(val=15, back=P(val=11, back=P(val=9, back=P(val=6, back=P(val=2, back=P(val=0, back=None)))))) 
>>> # Wanted: [15, 11, 9, 6, 2, 0] 
>>> 
>>> # Have to use: 
>>> def _unwind(q): 
    u = [] 
    while q: 
     u.append(q.val) 
     q = q.back 
    return u 

>>> q 
P(val=15, back=P(val=11, back=P(val=9, back=P(val=6, back=P(val=2, back=P(val=0, back=None)))))) 
>>> _unwind(q) 
[15, 11, 9, 6, 2, 0] 
>>> 

我一直在寻找的设定压力,所以我可以写类似的一些方法:

[val for val, q in q] 

也许通过重写P____ iter__和P____ next__以某种方式优雅地重新定义P的iter协议?

回答

2

请尝试以下操作:

>>> from collections import namedtuple 
>>> 
>>> class P(namedtuple('_P', 'val back')): 
...  def __iter__(self): 
...   while self: 
...    yield self.val, self.back 
...    self = self.back 
... 
>>> q = P(val=15, back=P(val=11, back=P(val=9, back=P(val=6, back=P(val=2, back=P(val=0, back=None)))))) 
>>> [val for val, back in q] 
[15, 11, 9, 6, 2, 0]