【发布时间】:2018-10-03 00:03:32
【问题描述】:
在 Python 中,在列表理解期间是否有任何 counter 可用,就像在 for 循环的情况下一样?
用这个例子会更清楚为什么我需要一个计数器:
我希望达到以下目标:
初始列表:['p', 'q', 'r', 's']
所需列表:[(1, 'P'), (2, 'Q'), (3, 'R'), (4, 'S')]
在期望的列表中,每个元组的第一个元素都是序数。如果它只是平面列表,我可以使用zip 来实现这一点。但是,我正在处理的列表是嵌套的,三层深度(想想分层数据),它是通过列表理解生成的。
所以,我想知道在列表理解过程中是否有任何方法可以引入这些序数。如果不是,最好的解决方案是什么。
附: : 这里小写字母被转换为大写字母,但这不是问题的一部分,可以认为它只是一个数据转换。
代码:
allObj = Category.objects.all()
tree =[(_, l1.name, [(__, l2.name, [(___, l3.name) for l3 in allObj if l3.parentid == l2.categoryid]) for l2 in allObj if l2.parentid == l1.categoryid]) for l1 in allObj if l1.parentid == None]
allObj 包含来自表类别的数据,而表类别又包含以邻接表形式表示的分层数据。
我已将_ 放在需要序号的位置。请注意,该列表是嵌套的,因此每个级别都会有一个单独的计数器,由 1、2 和 3 _s 表示。
【问题讨论】:
-
看看
enumerate(list, 1)docs.python.org/library/functions.html#enumerate -
您几乎可以肯定使用 zip 来实现这一点。如果您不向我们展示您的代码,没有人可以告诉您。
-
@Marcin:我也添加了代码 sn-p。
-
在保存在平面列表中的这个层次结构中进行计数并非易事。你应该首先建立一个真正的层次结构,然后你就可以依赖每个层次。
-
@Nobody:这个层次结构来自一个数据库表,因为它以邻接表的形式存储在那里。什么是建立真正的层次结构,你是说树?
标签: python