【问题标题】:Enumerate in nested for loop with list comprehension for inner increment枚举嵌套 for 循环,列表理解为内部增量
【发布时间】:2021-05-15 12:33:42
【问题描述】:

跟进this 关于如何在外部增量的列表理解中实现enumerate 的问题,我想知道是否有办法调整accepted answer 以创建一个inner 这次增加;我正在寻找生成此输出:

['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 来产生相同的输出,同时保持列表理解方法并且理想情况下没有任何导入,类似于另一个问题中接受的答案?

【问题讨论】:

  • 我的第一个答案是错误的

标签: python list-comprehension enumerate


【解决方案1】:

我最终设法自己解决了这个问题。发布以确保完整性。

[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']

【讨论】:

    【解决方案2】:

    棘手的部分是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 很痛苦。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-13
      • 1970-01-01
      • 2011-04-07
      • 2018-12-25
      • 2021-09-06
      • 1970-01-01
      • 1970-01-01
      • 2017-09-01
      相关资源
      最近更新 更多