簡體   English   中英

在嵌套的 for 循環中枚舉內部增量的列表理解

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM