在Python中,counter在列表理解期间是否存在任何可用的for循环?
为什么我需要一个计数器,这个例子更清楚:
我希望实现以下目标:
初步清单: ['p', 'q', 'r', 's']
期望清单: [(1, 'P'), (2, 'Q'), (3, 'R'), (4, 'S')]
在所需的列表中,每个元组的第一个元素是序数.如果它只是平面列表,我可能已经习惯zip了这一点.但是,我正在处理的列表是嵌套的,三层深度(考虑分层数据),它是通过列表理解生成的.
所以,我想知道是否有任何方法可以在列表理解期间引入这些序数.如果没有,那么什么是最好的解决方案.
PS:这里小写字母转换为大写字母,但这不是问题的一部分,将其视为数据转换.
码:
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]
Run Code Online (Sandbox Code Playgroud)
allObj 包含来自表类别的数据,该类别又包含以邻接列表形式表示的分层数据.
我已经放置_了我需要序数的地方.请注意,列表是嵌套的,因此每个级别将有一个单独的计数器,由1,2和3表示_.
Nic*_*son 49
[(i, x) for i, x in enumerate(some_list, 1)]
Run Code Online (Sandbox Code Playgroud)
[(i, x) for i, x in enumerate(some_list, 1) if i > 2]
Run Code Online (Sandbox Code Playgroud)
或者像这样
[(i, x) for i, x in enumerate(some_list, 1) if x != 'p']
Run Code Online (Sandbox Code Playgroud)
大多数情况下,您不需要这样做.相反,你只enumerate(some_list, 1)需要在一个for循环中调用需要枚举的位置.
当我偶然发现这个答案时,我正在寻找一些略有不同的东西.
我的情况是根据列表理解中的条件保持计数.为了防止对其他人有用,这就是我解决它的方法:
import itertools
counter = itertools.count(0)
[(next(counter), x) for x in some_list if x != 'p']
以这种方式,计数器仅在满足条件时递增,而不是在每次迭代时递增.
正如标准库为您提供的其他答案中已经显示的那样enumerate,这意味着您可能甚至不需要像这样的列表:
[(1, 'P'), (2, 'Q'), (3, 'R'), (4, 'S')]
Run Code Online (Sandbox Code Playgroud)
因为每次您需要将字母与与其位置相关的数字绑定时,您只需拨打 即可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
Run Code Online (Sandbox Code Playgroud)
这只是一个例子,也许您实际上需要这样的列表。