在名称约定更改的情况下在循环中生成变量名

2024-09-29 19:34:31 发布

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

我试图生成一个大的变量列表,但是有些变量可能有子部分。下面的代码是我目前所在的位置。你知道吗

import string

Num_Phases = 4          # Number of Phases
Subphases = [2, 3]      # Which Phases have Subphases
Num_Subphases = [2, 2]  # How Many Phases the respective Subphase have

Phases = []
for i in range(1, Num_Phases + 1):
    if i < 10:
        # Start with regular name Convention
        PhaseName = "Phase-0%s" %i
        # Check to see if phase has subphase
        for n in range(1, len(Num_Subphases) + 1): 
            if Subphases[n - 1] == i:
                # If there is a Subphase, Check how many Subphases
                for m in range(1, Num_Subphases[n - 1] + 1):
                    # for each subphase define a phase name
                    PhaseName = ("Phase-0%s" %i) + ('').join(string.ascii_lowercase[m-1])
                # Combine Phases into list
                Phases.append(PhaseName)            
        Phases.append(PhaseName) 

我目前得到的结果是:

['Phase-01', 'Phase-02b', 'Phase-02b', 'Phase-03b', 'Phase-03b', 'Phase-04']

但我希望它是:

['Phase-01', 'Phase-02a', 'Phase-02b', 'Phase-03a', 'Phase-03b', 'Phase-04']

这将是一个非常大的数据集,但我用这个作为一个例子。你知道吗


Tags: nameinforstringifcheckhaverange
2条回答

将m添加到列表阶段时,它将始终设置为范围的最大值。在将PhaseName添加到“阶段”列表之前,您正在覆盖它。您可以在m循环中移动附加项,检查重复项以避免添加它们。你知道吗

for m in range(1, Num_Subphases[n - 1] + 1):
            # for each subphase define a phase name
            PhaseName = ("Phase-0%s" %i) + ('').join(string.ascii_lowercase[m-1])
            # Combine Phases into list
            if PhaseName not in Phases:
               Phases.append(PhaseName)  

另一种不使用太多嵌套for的可能方法是构建一个表示每个阶段的子阶段数的数组,然后可以在列表压缩中使用doble for来构建最终结果

phases_arr = [1 for i in range(Num_Phases)]
for isub, numsub in zip(Subphases, Num_Subphases):
    phases_arr[isub-1] = numsub + 1

alphabet = string.ascii_lowercase

phases = ["Phase-%02d%s" % (i+1, alphabet[k-1] if k > 0 else "") for i in range(len(phases)) for k in range(phases[i])]

相关问题 更多 >

    热门问题