2013-11-16 2 views
0

Предположим, что у меня есть набор переменных, которые уже созданы. Они используют аналогичное (то есть предсказуемое соглашение об именах). Пример:Python; для цикла; итерация по существующему набору переменных

job0 = "X" 
job1 = " " 
job2 = " " 
job3 = "X" 
job4 = "X" 

Моя цель состоит в том, чтобы иметь возможность перебрать этих переменных и проверить, является ли они или не содержат в «X». Эти переменные «автоматически сгенерированы» другим циклом for.

Вот уже пример кода, я экспериментировал с:

job_count_array = [] 
global job_count 
for i in range(2, job_count+1): 
    job_count_array.append("sel.get_text(//form[@id='SubAvailSelectForm']/font/table[2]/tbody/tr[%d]/td[1]/small)" % i) 
print job_count_array #output for debug purposes 
for l, value in enumerate(job_count_array): 
    exec "job%d = value" % l #auto-generates variables with the above list indices 

Итак, как вы можете видеть, я получаю переменные, сгенерированные с помощью $ перечисления $ итерации. Кажется, я не могу найти способ проверить, не содержат ли эти автоматически сгенерированные переменные (т. Е. Job0, job1, job2, job3 и т. Д.) Либо «X», либо пустое пространство »». Вот моя попытка:

for i in range(0, job_count-1): 
    print "job%d" % i 
    if "job%d" % i == "X": 
     print "Excluding Job%d: Found Locked Status" % i 
     #I plan to add code to this line that will allow me to exclude the job this variable refers to for further testing/evaluation 
    if job%d % i == " ": 
     print "Including Job%d: Found Unlocked Status" % i 
     #I plan to add code to this line that will allow me to include the job this variable refers to for further testing/evaluation 
+3

Не используйте нумерованные переменные. Вместо этого используйте * список * или, в лучшем случае, словарь. У вас уже ** есть ** список * даже, 'job_count_array'. –

+1

[Сохранять данные из ваших имен переменных] (http://nedbatchelder.com/blog/201112/keep_data_out_of_your_variable_names.html). –

+0

Итак, вызов метода в индексе списка будет функционировать так же, как если бы я назначил его переменной? – philthy

ответ

1

У вас уже есть список: job_count_array. Все, что вам нужно сделать сейчас цикл по этому списку:

for job in job_count_array: 
    if job == "X": 
     # etc. 

Это позволяет понизить цикл с exec звонков тоже. Посмотрите, насколько это проще? Просто Keep data out of your variable names.

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

1

Вы должны следовать совету Martijn Pieters.

Это, я отвечу на ваш первоначальный вопрос.

Переменные хранятся в словаре под названием globals. Вы можете контактировать их и печатать спички:

for varname, value in globals().values(): 
    if varname.startswith('job') and value == 'X': 
     ... 
+0

Спасибо за понимание. – philthy

+0

@ пользователь2264406 Upvote? И выберите лучший ответ? –

+0

У меня недостаточно репутации, чтобы поддержать вас, извините. Я попытался выбрать оба ответа правильно, увидев, что вы оба внесли важный вклад. Я не знаю, как вознаградить тебя, прости! – philthy