Является ли назначение двух переменных элементам в одном списке лучшим способом доступа к этим элементам и выполнения операций с ними?

Скажем, у меня есть список

l = [1,2,3]

и я хочу суммировать каждый элемент в списке с каждым другим элементом в списке. Я мог бы сделать это:

x = [(a, b) for a in l for b in l]
y = [(a + b) for a in l for b in l]

x = [(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)]
y = [2, 3, 4, 3, 4, 5, 4, 5, 6]

Является ли назначение двух переменных (a и b) элементам в одном списке (l) лучшим способом доступа и выполнения операций с этими элементами? Есть лучший способ сделать это?

Я просмотрел список методов и функций и не смог их найти.

ОБНОВИТЬ

Многие люди рекомендовали функцию продукта itertools, поэтому я подумал, что включу время, прежде чем пометить как ответ:

mysetup = """
from itertools import product
l = [10, 15, 3, 7]
k = 17
"""
mycode = """
[i for i in product(l, repeat=2)]
"""

t = timeit.timeit(setup=mysetup, stmt=mycode, number=100000)
# 0.1505305


mysetup2 = """
l = [10, 15, 3, 7]
k = 17
"""
mycode2 = """
[(a, b) for a in l for b in l]
"""

t1 = timeit.timeit(setup=mysetup2, stmt=mycode2, number=100000)
# 0.1432976
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
6
0
102
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Попробуйте использовать itertools.product, который получает каждую комбинацию последовательности:

>>> from itertools import product
>>> l = [1,2,3]
>>> list(product(l, repeat=2))
[(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)]
>>> list(map(sum, product(l, repeat=2)))
[2, 3, 4, 3, 4, 5, 4, 5, 6]
>>> 

Попробуйте это, itertools.продукт

>>> from itertools import product
>>> l = [1,2,3]
>>> [sum(combination) for combination in list(product(l, repeat = 2))]
[2, 3, 4, 3, 4, 5, 4, 5, 6]
combinations_with_replacement не дает тех значений, которые хотел ОП. Вместо этого вы должны использовать product, но синхронизация показывает, что он медленнее, чем код в вопросе.
Thierry Lathuille 29.05.2019 12:43

@ThierryLathuille Спасибо за указание. Ответ был обновлен с помощью product.

shaik moeed 29.05.2019 12:49

Вот подход, основанный на itertools:

from operator import add
from itertools import product, starmap
l = [1,2,3]

list(starmap(add, product(l, repeat=2)))
# [2, 3, 4, 3, 4, 5, 4, 5, 6]

Давайте проверим тайминги:

l = list(range(1000))

%timeit list(map(sum, product(l, repeat=2)))
# 187 ms ± 14.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit [sum(combination) for combination in combinations_with_replacement(l, 2)]
# 123 ms ± 4.32 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

list(starmap(add, product(l, repeat=2)))
# 102 ms ± 4.11 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
combinations_with_replacement не дает те же значения, что и product - он не дает пары в обратном порядке, поэтому он примерно в два раза быстрее...
Thierry Lathuille 29.05.2019 12:39

Спасибо, что указали на @ThierryLathuille, действительно здесь мы хотим декартово произведение.

yatu 29.05.2019 12:43
Ответ принят как подходящий

Python предоставляет встроенный метод

from itertools import product
l = [1,2,3]

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

result= [sum(i) for i in product(l, repeat= 2) ]

#result=[2, 3, 4, 3, 4, 5, 4, 5, 6]

Другие вопросы по теме