Как напечатать все возможные комбинации в строке, используя itertools? - PullRequest
0 голосов
/ 11 февраля 2020

Я учусь Python лично в эти дни. У меня вопрос по поводу python кода.

A = "I " + (can/cannot) + " fly"
B = "I am " + (13/15) + " years old"

В этих случаях переменная A может выбрать два варианта: 'can' или 'cannot'. Кроме того, переменная B может выбрать две опции: 13 или 15. Я не хочу использовать эти опции самостоятельно. Я не знаю, как выбрать два варианта автоматически.

Если это может быть автоматически, я хочу использовать модуль itertools. Я хочу, чтобы результат использовал "комбинации", чтобы сделать это.

C = [(I can fly I am 13 years old) , (I can fly I am 15 years old) , (I cannot fly I am 13 years old) , (I cannot fly I am 15 years old)]

Если кто-нибудь, кто может помочь мне с этим кодом, пожалуйста, помогите.

Ответы [ 3 ]

3 голосов
/ 11 февраля 2020

Сначала вы хотели бы найти все комбинации (можно / не можете) и (13/15).

Для этого вы можете использовать:

import itertools
can_or_cannot = ['can', 'cannot']
age = [13, 15]
list(itertools.product(can_or_cannot, age))

Out[13]: [('can', 13), ('can', 15), ('cannot', 13), ('cannot', 15)]

Теперь вы можно использовать понимание списка:

C = [f"I {can_or_cannot} fly I am {age} years old" for (can_or_cannot, age) in list(itertools.product(can_or_cannot, age))]


Out[15]: 
['I can fly I am 13 years old',
 'I can fly I am 15 years old',
 'I cannot fly I am 13 years old',
 'I cannot fly I am 15 years old']

Или, как предлагает @Olvin Roght, вы можете использовать шаблон и starmap:

from itertools import product, starmap

template = 'I {} fly I am {} years old'
result = list(starmap(template.format, product(can_or_cannot, age)))
1 голос
/ 11 февраля 2020

По некоторым причинам, @theletz решил не включать мою рекомендацию в свой ответ, поэтому я опубликую его здесь:

from itertools import product, starmap

can_or_cannot = ['can', 'cannot']
age = [13, 15]
template = 'I {} fly I am {} years old'

result = list(starmap(template.format, product(can_or_cannot, age)))

Как это работает?

  1. Мы используем itertools.product(), чтобы получить декартово произведение двух списков;
  2. В результате предыдущего действия мы перенаправляем непосредственно на itertools.starmap(), который выполняет str.format() и передать распакованную пару в качестве аргументов функции.
0 голосов
/ 11 февраля 2020

Вы можете попробовать это:

fly = ["can","cannot"]
lst = []
for i in fly:
    A = "I " + i + " fly"
    for j in [13,15]:
        B = " I am " + str(j) + " years old"
        lst.append((A+B))
print(lst)
...