[英]Can Python list comprehension be used in this use-case?
最近我不得不遍历一棵树,从任意节点开始直到它的根。 我写了一些类似的东西
breadcrumbs = []
while node is not None:
breadcrumbs.append(node.get_text())
node = node.get_parent()
我发现它看起来很像一个丑陋的列表构造实现,它使用
result = []
while node is not None:
result.append(node.get_text())
node = node.next()
而不是更惯用的列表理解
result = [node.get_text() for node in nodes]
这让我想知道是否有一种更惯用的方法来从我的树遍历中构建一个列表。 为了完整起见(并且因为以上摘录主要是伪代码),这是我使用的实际代码:
model, treeiter = self.treeview.get_selection().get_selected()
breadcrumbs = []
while treeiter is not None:
breadcrumbs.append(model.get_value(treeiter, self.COL_TEXT))
treeiter = model.iter_parent(treeiter)
path = '/'.join(reversed(breadcrumbs))
对于上下文,第一行调用Gtk.TreeSelection.get_selected (它的一个返回值在 API 中称为iter
但与 Python 迭代器无关)。 我的代码从用户选择的路径创建一个字符串,例如,下面示例中的"A/b/2"
:
+- A
| |- a
| \- b
| |- 1
| \- 2 <- selected element
\- B
|- c
\- d
你是真的,你使用的树结构不是很pythonic。 但是,您可以使用自制的generators轻松地将其转换为更 Pythonic 的解决方案。
例如,要遍历父母(或祖先),您可以像这样定义一个iter_parents
函数:
def iter_parents(node):
while node is not None:
yield node
node = node.get_parent()
有了这个,你可以像这样构建面包屑:
breadcrumbs = [node.get_text() for node in iter_parents(branch)]
这是一个小演示:
class Node(object):
def __init__(self, text, parent=None):
self._text = text
self._parent = parent
def get_text(self):
return self._text
def get_parent(self):
return self._parent
branch = Node("c", Node("b", Node("a")))
breadcrumbs = [node.get_text() for node in iter_parents(branch)]
print(breadcrumbs)
# -> ['c', 'b', 'a']
对于node.next()
你可以用同样的方式定义一个iter_next()
生成器。
编辑
使用reverse
来反转列表,例如:
breadcrumbs = [node.get_text() for node in iter_parents(branch)]
breadcrumbs.reverse()
print(breadcrumbs)
# -> ['a', 'b', 'c']
当然,您可以像这样将 while 循环包装在生成器中:
def get_parents(node):
while node is not None:
yield node
node = node.get_parent()
然后你可以使用:
result = [node.get_text() for node in get_parents(nodes)]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.