Как сгенерировать набор символов с определенными индексами - PullRequest
0 голосов
/ 06 мая 2019

Я хотел бы определить набор символов следующим образом: У меня есть три разных подписки: [1,3,5] Должны быть сгенерированы следующие символы: a_11, a_13, a_15, a_31, a_33, a_35, a_51, a_53, a_55

Как мне сделать это эффективно? Так что без определения всех символов отдельно.

Ответы [ 4 ]

2 голосов
/ 06 мая 2019
from sympy import Symbol
from itertools import combinations_with_replacement

symbol_indices = set([])
for a,b in combinations_with_replacement([1,3,5],2):
    symbol_indices.add( (a,b)  )
    symbol_indices.add( (b,a))

[Symbol(f'a_{a}{b}' ) for a,b in symbol_indices]
1 голос
/ 06 мая 2019

Если вы не хотите импортировать другие вещи, кроме «sympy», вы можете использовать понимание вложенного списка.

ind = (1, 3, 5)

sympy.symbols(['a_{}{}'.format(n, m) for n in ind for m in ind])

Я думаю, itertools просто скрывает настоящую логику за алгоритмами. Лично я предпочитаю писать код вместо использования какой-либо сильно вложенной функции с нечитаемыми аргументами.

1 голос
/ 06 мая 2019

вы должны попробовать это

from itertools import product

l1 = [1, 3, 5]
result = [f"a_{tuple_[0]}{tuple_[1]}" for tuple_ in product(map(str, l1), repeat=2)]

Выходы

['a_11', 'a_13', 'a_15', 'a_31', 'a_33', 'a_35', 'a_51', 'a_53', 'a_55']

Для меня

0 голосов
/ 06 мая 2019

без какой-либо библиотеки, для цикла:

l= [1,3,5]
print (list("a_{}{}".format(*x) for x in list((x,y) for x in l for y in l))) 

вывод:

['a_11', 'a_13', 'a_15', 'a_31', 'a_33', 'a_35', 'a_51', 'a_53', 'a_55']

с itertools:

from itertools import product
l= [1,3,5]
print (list("a_{}{}".format(*x) for x in list(product(l,repeat = 2))))

вывод:

['a_11', 'a_13', 'a_15', 'a_31', 'a_33', 'a_35', 'a_51', 'a_53', 'a_55']

ПРИМЕЧАНИЕ:

list((x,y) for x in l for y in l) 
# equivalent to:
list(product(l,repeat = 2))

itertools.product ()

Этот инструмент вычисляетдекартово произведение входных итераций.Это эквивалентно вложенным циклам for.Например, product (A, B) возвращает то же самое, что и ((x, y) для x в A для y в B) .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...