Необходимо объединить 2000 переменных в список для использования в цикле for

#python #list #for-loop

#python #Список #цикл for

Вопрос:

Я пытаюсь использовать цикл for для выполнения 2000 итераций в selenium. Я создал свои перестановки и создал отдельные переменные для каждой перестановки (использовал Excel для их объединения).

У меня есть мои переменные, перечисленные из A1 … A2000. Мне нужно объединить это в единый список, чтобы я мог использовать его в цикле for с моим кодом. Я знаю, как это сделать, только если я разделю это запятой (например: A1, A2, A3 …), но это нереально для 2000 переменных.

Есть предложения?

Переменные перечислены последовательно следующим образом:

     A1 = ('xpath text')
    A2 = ('xpath text')
    A2000 = ('xpath text')
  

Я использую selenium для обхода веб-страниц через выпадающие списки

     for i in range(1, 2000):
      xpathlist = [Aamp;i]
      for xp in xpathlist:
        b.find_element_by_xpath(xp)
        click = download.click()
  

Комментарии:

1. Итак, в вашем коде перечислены 2000 переменных в диапазоне от A1 до A2000? Или я что-то здесь неправильно понял.

2. «Я создал свои перестановки и создал отдельные переменные для каждой перестановки (использовал Excel для их объединения)» Я знаю, что в настоящее время это бесполезно, но это ваша фундаментальная проблема. Для начала вам следовало использовать список. Всякий раз, когда вы видите себя динамически создающим переменные, пронумерованные от 0… N просто используйте список . В любом случае, предполагая, что ваши переменные находятся в глобальной области видимости, вы можете использовать global_vars = globals() , а затем использовать global_vars['A' str(i)] для доступа к ним, но это взлом.

3. Итак, эта проблема, с которой я столкнулся, заключается в том, что мне нужно было создать перестановку всех выпадающих списков для моего веб-обхода (всего 2000 постоянных.) Последним xpath (в виде строки) должен быть путь загрузки xpath, любая перестановка с загрузкой ранее не будет работать. Итак, моя стратегия заключалась в использовании функции перестановки, чтобы получить все комбинации, а затем использовать Excel concatenate для присоединения к концу (интересно, мог бы я сейчас использовать append fx в python ..)

Ответ №1:

Предположим, у вас есть все эти переменные в модуле foo.py :

 import foo
all_vars = (getattr(foo, f'A{i}') for i in range(1, 2000))
  

Преимущество этого заключается в том, что не создается список, а извлекается каждое значение при его повторении. Больше информации о генераторах здесь

Примечание: я использовал форматированные строки ( f'' ), для которых требуется python 3.6 , для более старых версий используйте 'A{}'.format(i) или 'A%d' % i .

Ответ №2:

…использовал Excel для их объединения…

Возможно, я слишком много читаю об этом, но вы можете обойти Excel с помощью чего-то вроде:

 from itertools import product

NAMES= ('x', 'y', 'z')
VALUES = ('foo', 'bar')

nvs = [f'{n} {v}' for n, v in product(NAMES, VALUES)]
print(nvs)

['x foo',
 'x bar',
 'y foo',
 'y bar',
 'z foo',
 'z bar']
  

Или для перестановок (как вы указали):

 from itertools import permutations

VALUES = ('foo', 'bar', 'baz', 'qux')

perms = [f'{a}/{b}/{c}' for a, b, c in permutations(VALUES, 3)]
print(perms)
['foo/bar/baz', 'foo/bar/qux', 'foo/baz/bar', 'foo/baz/qux',
 'foo/qux/bar', 'foo/qux/baz', 'bar/foo/baz', 'bar/foo/qux',
 'bar/baz/foo', 'bar/baz/qux', 'bar/qux/foo', 'bar/qux/baz',
 'baz/foo/bar', 'baz/foo/qux', 'baz/bar/foo', 'baz/bar/qux',
 'baz/qux/foo', 'baz/qux/bar', 'qux/foo/bar', 'qux/foo/baz',
 'qux/bar/foo', 'qux/bar/baz', 'qux/baz/foo', 'qux/baz/bar']
  

Затем вы можете просто выполнить итерацию по списку nvs или perms

Комментарии:

1. Часть моей проблемы заключается в том, что у меня есть 6 выпадающих списков с общим количеством 2000 перестановок, и последняя строка xpath должна быть загружена. Моя стратегия заключалась в том, чтобы выполнить завивку на python, а затем объединить загрузку в Excel. Выполнение этого таким образом привело к созданию 2000 переменных (A1 ….A2000) Вероятно, есть лучший способ выполнить перестановки, но я не уверен, как