gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:56:12 25 4
gpt4 key购买 nike

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

该示例在我的原始程序中使用了一个 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 的方法,这样我就可以写出如下内容:

[val for val, q in q]

也许通过以某种方式覆盖 P.__iter__ 和 P.__next__ 来优雅地重新定义 P 的 iter 协议(protocol)?

最佳答案

尝试以下操作:

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

关于python - 使用列表理解从嵌套的 Python 数据结构中获取值列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18286193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com