Генерация имен переменных в цикле с изменением соглашения об именах - PullRequest
0 голосов
/ 28 июня 2018

Я пытаюсь создать большой список переменных, но некоторые переменные могут иметь подчасти. Код ниже, где я сейчас нахожусь.

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

Это будет для очень большого набора данных, но я использую это в качестве примера.

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Другое возможное применение без использования слишком большого количества вложенных форов - это создание массива, который указывает количество подфаз каждой фазы, затем вы можете использовать doble для в понимании списка для построения окончательного результата

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])]
0 голосов
/ 28 июня 2018

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)  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...