Получить декартово произведение ряда списков?

Одним из основных принципов необработанного API WebDriver является ожидание того, что пользователь знает состояние DOM для автоматизируемой страницы. Это означает, что в логике API вызов findElement с использованием локатора несуществующего элемента является исключительным условием, что делает исключение совершенно легитимным. Хотя можно утверждать, что ожидание, встроенное в поведение API, ошибочно, это выходит за рамки этого ответа. Если вам нужна логическая логика для определения того, существует ли элемент, вам нужен метод-обертка, как вы уже обнаружили. В рамках этого метода оболочки у вас есть два варианта:

  1. Используйте findElement и поймайте NoSuchElementException. Обратите внимание, что использование WebDriverWait неявно ловит это исключение для вас, как и семантический эквивалент.

  2. Используйте findElements (обратите внимание на «s»), который возвращает пустой список без исключения, если элемент не существует.

288
задан Georgy 5 June 2019 в 23:17
поделиться

6 ответов

В Python 2.6 +

import itertools
for element in itertools.product(*somelists):
    print(element)

Документация: Python 3 - itertools.product

346
ответ дан Rufflewind 23 November 2019 в 01:46
поделиться
import itertools
>>> for i in itertools.product([1,2,3],['a','b'],[4,5]):
...         print i
...
(1, 'a', 4)
(1, 'a', 5)
(1, 'b', 4)
(1, 'b', 5)
(2, 'a', 4)
(2, 'a', 5)
(2, 'b', 4)
(2, 'b', 5)
(3, 'a', 4)
(3, 'a', 5)
(3, 'b', 4)
(3, 'b', 5)
>>>
76
ответ дан Jason Baker 23 November 2019 в 01:46
поделиться

Для Python 2.5 и более старый:

>>> [(a, b, c) for a in [1,2,3] for b in ['a','b'] for c in [4,5]]
[(1, 'a', 4), (1, 'a', 5), (1, 'b', 4), (1, 'b', 5), (2, 'a', 4), 
 (2, 'a', 5), (2, 'b', 4), (2, 'b', 5), (3, 'a', 4), (3, 'a', 5), 
 (3, 'b', 4), (3, 'b', 5)]

Вот рекурсивная версия product() (просто иллюстрация):

def product(*args):
    if not args:
        return iter(((),)) # yield tuple()
    return (items + (item,) 
            for items in product(*args[:-1]) for item in args[-1])

Пример:

>>> list(product([1,2,3], ['a','b'], [4,5])) 
[(1, 'a', 4), (1, 'a', 5), (1, 'b', 4), (1, 'b', 5), (2, 'a', 4), 
 (2, 'a', 5), (2, 'b', 4), (2, 'b', 5), (3, 'a', 4), (3, 'a', 5), 
 (3, 'b', 4), (3, 'b', 5)]
>>> list(product([1,2,3]))
[(1,), (2,), (3,)]
>>> list(product([]))
[]
>>> list(product())
[()]
34
ответ дан jfs 23 November 2019 в 01:46
поделиться

с itertools.product:

import itertools
result = list(itertools.product(*somelists))
19
ответ дан SilentGhost 23 November 2019 в 01:46
поделиться

В Python 2.6 и выше Вас может использовать 'itertools.product'. В более старых версиях Python можно использовать следующее (почти - см. документацию), эквивалентный код из документации , по крайней мере, как начальная точка:

def product(*args, **kwds):
    # product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy
    # product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111
    pools = map(tuple, args) * kwds.get('repeat', 1)
    result = [[]]
    for pool in pools:
        result = [x+[y] for x in result for y in pool]
    for prod in result:
        yield tuple(prod)

результатом обоих является итератор, поэтому при реальной необходимости в списке для обработки furthert используйте list(result).

11
ответ дан 23 November 2019 в 01:46
поделиться

подход Стоунхенджа:

def giveAllLists(a, t):
    if (t + 1 == len(a)):
        x = []
        for i in a[t]:
            p = [i]
            x.append(p)
        return x
    x = []

    out = giveAllLists(a, t + 1)
    for i in a[t]:

        for j in range(len(out)):
            p = [i]
            for oz in out[j]:
                p.append(oz)
            x.append(p)
    return x

xx= [[1,2,3],[22,34,'se'],['k']]
print(giveAllLists(xx, 0))


вывод:

[[1, 22, 'k'], [1, 34, 'k'], [1, 'se', 'k'], [2, 22, 'k'], [2, 34, 'k'], [2, 'se', 'k'], [3, 22, 'k'], [3, 34, 'k'], [3, 'se', 'k']]
0
ответ дан 23 November 2019 в 01:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: