【问题标题】:Generate variable names in loop with name convention changing在更改名称约定的循环中生成变量名称
【发布时间】:2018-12-08 00:19:20
【问题描述】:

我正在尝试生成大量变量,但其中一些变量可能包含子部分。下面的代码是我目前所在的位置。

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

这将用于一个非常大的数据集,但我以此为例。

【问题讨论】:

  • 这些是列表中的字符串,这与变量名有什么关系?
  • 我的代码的另一部分需要列表格式的它们。
  • 为什么使用range(1, len(Num_Subphases) + 1) 而不是range(0, len(Num_Subphases))?这样你就不必一直写n-1
  • 我没有任何理由,我只是没想到这样做。谢谢!

标签: python string list loops ascii


【解决方案1】:

当您将其添加到列表阶段时,m 将始终设置为范围的最大值。在将 PhaseName 添加到 Phases 列表之前,您正在覆盖它。您可以在 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)  

【讨论】:

  • 当我将它添加到代码中时,它最终给了我:['Phase-01', 'Phase-02a', 'Phase-02b','Phase-02b', 'Phase-03a', 'Phase-03b', 'Phase-03b', 'Phase-04']
  • 最后一个被添加两次,因为在循环之后第二个附加 PhaseName。如果您在第二次添加If PhaseName not in Phases: 之前添加Phases.append(PhaseName),它应该可以解决此问题。
  • 就是这样。谢谢。
【解决方案2】:

另一种不使用太多嵌套fors的可能方法是构建一个指示每个阶段的子阶段数的数组,然后您可以在列表综合中使用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])]

【讨论】:

    猜你喜欢
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    相关资源
    最近更新 更多