[英]Enumerate in nested for loop with list comprehension for inner increment
跟进这个关于如何在外部增量的列表理解中实现enumerate
的问题,我想知道是否有办法调整接受的答案以便这次创建内部增量; 我正在寻找生成这个 output:
['D_50_1-1_1',
'D_50_2-1_2',
'D_50_3-1_3',
'D_80_1-2_1',
'D_80_2-2_2',
'D_80_3-2_3',
'D_20_1-3_1',
'D_20_2-3_2',
'D_20_3-3_3',
'D_60_1-4_1',
'D_60_2-4_2',
'D_60_3-4_3',
'E_35_1-5_1',
'E_35_2-5_2',
'E_35_3-5_3',
'E_25_1-6_1',
'E_25_2-6_2',
'E_25_3-6_3']
其中内部增量是倒数第二列( 1,1,1,2,2,3,3,3...6,6,6
)。
目前,我通过根据levelB
的长度硬编码增量(例如list(range(1, 4+1))
)来实现这一点,这显然容易出错:
[f'{levelA}_{levelB}_{sub}-{inner_increment}_{sub}'
for levelA, pairs in
[('D', dict(zip([50,80,20,60], list(range(1, 4+1))))),
('E', dict(zip([35, 25], list(range(5, 7+1)))))]
for levelB,inner_increment in pairs.items()
for sub in range(1, 3+1)
]
有没有办法通过引入enumerate
来产生相同的 output ,同时保持列表理解方法并且理想情况下没有任何导入,类似于另一个问题中接受的答案?
棘手的部分是levelb的分区。 我们必须对整个事物进行一次枚举,但有一种方法可以将其分开,以便只有部分内容与每个级别匹配。 这是一个带有一些初步步骤的版本:
levela = 'D', 'E'
levelb = (50, 80, 20, 60), (35, 25)
levelc = 1, 2, 3
pairs = [
(a, b)
for a, partition in zip(levela, levelb)
for b in partition
]
result = [
(a, b, n, i)
for i, (a, b) in enumerate(pairs, start=1)
for n in (1, 2, 3)
]
actual = [f'{a}_{b}_{n}-{i}_{n}'.format(a, b, i, n) for a, b, n, i in result]
desired = ['D_50_1-1_1',
'D_50_2-1_2',
'D_50_3-1_3',
'D_80_1-2_1',
'D_80_2-2_2',
'D_80_3-2_3',
'D_20_1-3_1',
'D_20_2-3_2',
'D_20_3-3_3',
'D_60_1-4_1',
'D_60_2-4_2',
'D_60_3-4_3',
'E_35_1-5_1',
'E_35_2-5_2',
'E_35_3-5_3',
'E_25_1-6_1',
'E_25_2-6_2',
'E_25_3-6_3']
for a, b in zip(result, desired):
if a == b:
print (a)
else:
print (a, b)
不能使用 itertools 很痛苦。
我最终设法自己解决了这个问题。 发布以确保完整性。
[f'{levelA}_{levelB}_{sub}-{increment}_{sub}'
for increment, (levelA, levelB) in enumerate(
(
(levelA,levelB)
for levelA,lists in
[('D', [50,80,20,60]),
('E', [35, 25])]
for levelB in lists
), start=1,
)
for sub in range(1,3+1)
]
Out[67]:
['D_50_1-1_1',
'D_50_2-1_2',
'D_50_3-1_3',
'D_80_1-2_1',
'D_80_2-2_2',
'D_80_3-2_3',
'D_20_1-3_1',
'D_20_2-3_2',
'D_20_3-3_3',
'D_60_1-4_1',
'D_60_2-4_2',
'D_60_3-4_3',
'E_35_1-5_1',
'E_35_2-5_2',
'E_35_3-5_3',
'E_25_1-6_1',
'E_25_2-6_2',
'E_25_3-6_3']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.