在Python语言中,在列表理解过程中有没有像for
循环那样可用的counter
?
通过这个例子,我需要一个计数器的原因就更清楚了:
我希望做到以下几点:
初始列表:['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个_
表示的每个级别上都会有一个单独的计数器。
发布于 2012-02-08 16:56:39
最基本的情况
[(i, x) for i, x in enumerate(some_list, 1)]
使用if语句应用筛选器
[(i, x) for i, x in enumerate(some_list, 1) if i > 2]
或者像这样
[(i, x) for i, x in enumerate(some_list, 1) if x != 'p']
一句忠告
大多数情况下,您不需要这样做。相反,您只需在需要枚举的地方调用enumerate(some_list, 1)
,例如在for
循环中。
发布于 2017-09-07 15:45:30
当我偶然发现这个答案的时候,我正在寻找一些稍微不同的东西。
我的情况是根据列表理解中的条件进行计数。为了防止它对其他人有用,我是这样解决它的:
import itertools counter = itertools.count(0) [(next(counter), x) for x in some_list if x != 'p']
这样,计数器将只在满足条件时递增,而不是在每次迭代时递增。
发布于 2012-02-08 17:09:13
正如在其他答案中所显示的,标准库为您提供enumerate
,这意味着您可能甚至不需要如下列表:
[(1, 'P'), (2, 'Q'), (3, 'R'), (4, 'S')]
因为每次需要将字母与其位置相关的数字绑定时,只需调用enumerate
即可。
示例:
>>> low = ['p', 'q', 'r', 's']
>>> upp = [c.upper() for c in low]
>>>
>>> for i,c in enumerate(upp, 1):
... print(i,c)
...
1 P
2 Q
3 R
4 S
这只是一个例子,也许你真的需要这样的列表。
https://stackoverflow.com/questions/9197844
复制相似问题