#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) Вероятно, есть лучший способ выполнить перестановки, но я не уверен, как