在python列表理解中保持计数

2024-05-16 21:40:51 发布

您现在位置:Python中文网/ 问答频道 /正文

在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表示


Tags: 数据nameinl1列表forif计数器
3条回答

当我偶然发现这个答案时,我正在寻找一些稍微不同的东西。

我的情况是根据列表理解中的条件进行计数。 万一对别人有用,我就这么解决了:

import itertools counter = itertools.count(0) [(next(counter), x) for x in some_list if x != 'p']

这样,计数器将只在满足条件时递增,而不是在每次迭代时递增。

最基本的情况

[(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循环中。

如其他答案所示,标准库提供给您^{},这意味着您可能甚至不需要如下列表:

[(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

这只是一个例子,也许你真的需要这样的清单。

相关问题 更多 >