使用列表理解从嵌套的Python数据结构获取值列表?

使用列表理解从嵌套的Python数据结构获取值列表?,python,data-structures,Python,Data Structures,在使用耐心排序计算最长递增子序列时,我创建了一个(值,反向链接)对的嵌套元组,然后需要爬网以按顺序获取所有值。 目前,我使用一个小函数来完成这项工作,但我想知道是否有一种方法可以使用列表理解来完成同样的工作 该示例使用了与我的原始程序相同的namedtuple,并应说明我的问题: >>> from collections import namedtuple >>> P = namedtuple('P', 'val, back') >>> q

在使用耐心排序计算最长递增子序列时,我创建了一个(值,反向链接)对的嵌套元组,然后需要爬网以按顺序获取所有值。 目前,我使用一个小函数来完成这项工作,但我想知道是否有一种方法可以使用列表理解来完成同样的工作

该示例使用了与我的原始程序相同的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]
>>> 
也许通过以某种方式覆盖p.u iter_uu和p.u next_uu来优雅地重新定义p的iter协议?

尝试以下内容:

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