Python every possible combination of a string

纵然是瞬间 提交于 2020-12-29 08:43:03

问题


Hi so I'm working with python and I'm trying to write a method where given a string, it would find every combination of that string and append it to a list. I'll give the string and show the outcome that I want.

string: x = 'god'

outcome:

lst = ['g', 'o', 'd', 'go', 'gd', 'og', 'od', 'dg', 'do', 'god', 'gdo', 'ogd', 'odg', 'dgo', 'dog']

A letter can only be used by the number of times it appears on the string given, so if our string is 'god', 'gg' or 'goo' etc. cannot be appended. If this could be done using recursion that would be great!


回答1:


Use permutations:

from itertools import permutations

x = 'god'


perms = []

for i in range(1, len(x)+1):
    for c in permutations(x, i):
        perms.append("".join(c))

print(perms) 
# ['g', 'o', 'd', 'go', 'gd', 'og', 'od', 'dg', 'do', 'god', 'gdo', 'ogd', 'odg', 'dgo', 'dog']



回答2:


Use itertools.permutations and list comprehensions

from itertools import permutations
[''.join(j) for i in range(1,len(x) + 1) for j in  permutations(x, i)]

Output

['g', 'o', 'd', 'go', 'gd', 'og', 'od', 'dg', 'do', 'god', 'gdo', 'ogd', 'odg', 'dgo', 'dog']



回答3:


You want to use itertools. From what you write, it sounds like you want to use itertools.permutation.

>>> import itertools
>>> letters = 'god'
>>> combinations = []
>>> for i in range(len(letters)):
...     combinations.extend(
...         [''.join(x) for x in itertools.permutations(letters, i + 1)])
>>> print(combinations)
['g', 'o', 'd', 'go', 'gd', 'og', 'od', 'dg', 'do', 'god', 'gdo', 'ogd', 'odg', 'dgo', 'dog']



回答4:


What you're trying to do here is to take the powerset of whatever string you pass in. What you'll want to do is convert that string into a list of characters, and then use the definition of powersets to use simple list extension to create what you are looking for.

def list_powerset(lst): # the power set of the empty set has one element, the empty set result = [[]] for x in lst: # for every additional element in our set # the power set consists of the subsets that don't # contain this element (just take the previous power set) # plus the subsets that do contain the element (use list # comprehension to add [x] onto everything in the # previous power set) result.extend([subset + [x] for subset in result]) return result

The above code was found at http://rosettacode.org/wiki/Power_set#Python




回答5:


import itertools

def _itersubs(x):
    for i in range(1, len(x)+1):
        yield from itertools.permutations(x, i)
        # before 3.4, replace with:
        # for y in itertools.permutations(x, i): yield y

def thefuncyouwant(x):
    return list(_itersubs(x))

I'm not sure you actually want a list of 2 ** len(x) items -- it will take a lot of memory for any x not very short -- but, it's what you asked for, so here it is. The iterator yielding one item at a time is obviously more natural and probably preferable, but just wrapping it in a list call will eat up just as much memory as you crave!-)



来源:https://stackoverflow.com/questions/28870709/python-every-possible-combination-of-a-string

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!