Python 如何使用列表理解向上遍历链接列表?

Python 如何使用列表理解向上遍历链接列表?,python,list-comprehension,Python,List Comprehension,我一直在想一种使用列表表达式遍历层次结构(如链表)的方法,但没有找到任何可行的方法 基本上,我想转换以下代码: p = self.parent names = [] while p: names.append(p.name) p = p.parent print ".".join(names) 成一行,如: print ".".join( [o.name for o in <???>] ) 列表理解处理迭代器对象(使用next()方法)。您需要为您的结构定义迭代器,以便能

我一直在想一种使用列表表达式遍历层次结构(如链表)的方法,但没有找到任何可行的方法

基本上,我想转换以下代码:

p = self.parent
names = []
while p:
  names.append(p.name)
  p = p.parent
print ".".join(names)
成一行,如:

print ".".join( [o.name for o in <???>] )

列表理解处理迭代器对象(使用next()方法)。您需要为您的结构定义迭代器,以便能够以这种方式对其进行迭代。

列表理解适用于迭代器对象(使用next()方法)。您需要为您的结构定义一个迭代器,以便能够以这种方式对其进行迭代。

我能想到的最接近的事情是创建一个父生成器:

# Generate a node's parents, heading towards ancestors
def gen_parents(node):
   node = node.parent
   while node:
      yield node
      node = node.parent

# Now you can do this
parents = [x.name for x in gen_parents(node)]
print '.'.join(parents)
def fixedpoint(f, start, stop):
    while start != stop:
        yield start
        start = f(start)

我能想到的最接近的事情是创建父生成器:

# Generate a node's parents, heading towards ancestors
def gen_parents(node):
   node = node.parent
   while node:
      yield node
      node = node.parent

# Now you can do this
parents = [x.name for x in gen_parents(node)]
print '.'.join(parents)
def fixedpoint(f, start, stop):
    while start != stop:
        yield start
        start = f(start)

你的LinkedList需要能够正常工作

它对迭代器和生成器都非常深入

一旦你这样做了,你就可以做到:

print ".".join( [o.name for o in self] )

你的LinkedList需要能够正常工作

它对迭代器和生成器都非常深入

一旦你这样做了,你就可以做到:

print ".".join( [o.name for o in self] )

如果您希望您的解决方案是通用的,请使用通用技术。这是一个定点式发电机:

# Generate a node's parents, heading towards ancestors
def gen_parents(node):
   node = node.parent
   while node:
      yield node
      node = node.parent

# Now you can do this
parents = [x.name for x in gen_parents(node)]
print '.'.join(parents)
def fixedpoint(f, start, stop):
    while start != stop:
        yield start
        start = f(start)
只要这两个值都不等于stop,它将返回一个生成器,使其产生start、f(start)、f(f(start))、f(f(start))、

用法:

print ".".join(x.name for x in fixedpoint(lambda p:p.parent, self, None))

我的个人助手库多年来一直具有类似定点的功能。。。它对于快速破解非常有用。

如果您希望您的解决方案是通用的,请使用通用技术。这是一个定点式发电机:

# Generate a node's parents, heading towards ancestors
def gen_parents(node):
   node = node.parent
   while node:
      yield node
      node = node.parent

# Now you can do this
parents = [x.name for x in gen_parents(node)]
print '.'.join(parents)
def fixedpoint(f, start, stop):
    while start != stop:
        yield start
        start = f(start)
只要这两个值都不等于stop,它将返回一个生成器,使其产生start、f(start)、f(f(start))、f(f(start))、

用法:

print ".".join(x.name for x in fixedpoint(lambda p:p.parent, self, None))

我的个人助手库多年来一直具有类似定点的功能。。。它对于快速黑客非常有用。

是的!这就是我一直在寻找的东西。我用我的修改更新了我的答案。
fixedpoint
可以用稍微更一般的函数编写:
def fixedpoint(f,start,stop):返回cfor(start,lambda current:current!=stop,f)
是!这就是我一直在寻找的东西。我用我的修改更新了我的答案。
fixedpoint
可以用稍微更一般的函数编写:
def fixedpoint(f,start,stop):返回cfor(start,lambda current:current!=stop,f)
PDF是受限访问的。。。也许可以提供这些信息?PDF是受限访问的。。。也许可以提供这些信息?