Генерация всех комбинаций и перестановок каждого слова в списке - PullRequest
3 голосов
/ 30 сентября 2019

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

Например, если список входных слов:cat mat

Выходной файл будет выглядеть следующим образом: act at ta act cat

Я новичок в питоническом коде. У меня есть код, который уже запущен, но он не работает для очень длинных слов, таких как «фотосинтез». Чего мне не хватать?

from itertools import permutations
def x():
  y = ["cat", "mat"]
  for i in y:
    z = [perm for length in range(1, len(i) + 1) for perm in permutations(i, length)]
    for i in z:
      a = ''.join(i)
      print(a)
x()

Ответы [ 2 ]

2 голосов
/ 30 сентября 2019

Скорее всего, вам не хватает памяти. Но в этом случае в этом нет необходимости. Вместо понимания списка вам нужен генератор. Например,

from itertools import permutations

def x(y):
   for i in y:
       for length in range(1, len(i) + 1):
           for perm in permutations(i, length):
               yield ''.join(perm)


for p in x(["cat", "mat"]):
   print(p)

, и теперь вы также можете записать все это в файл - строка за строкой - или в базу данных, или что-то еще.

Причина в том, что генератор не сохраняетвсе данные в памяти. Он печатает его / записывает в файл и забывает об этом. И перестановки, как правило, становятся очень большими быстро.

(Вы также можете использовать генераторное понимание)

https://code -maven.com / list-comppresion-vs-generator-expression https://www.geeksforgeeks.org/python-list-comprehensions-vs-generator-expressions/

2 голосов
/ 30 сентября 2019

Это просто занимает много времени, чтобы вычислить результаты для всех перестановок "фотосинтеза". Используйте генераторный подход, как показано ниже.

from itertools import permutations

def get_perms(value, length):
    for l in range(length):
        for perm in permutations(value, l):
            yield ''.join(perm)
    else:
        return []

def x():
  y = ["photosynthesis"]
  for i in y:
      perms = get_perms(i, len(i))
      for item in perms:
          print(item)

x()
...