python 如何生成将单数字符放入单词的排列
python how to generate permutations of putting a singular character into a word
不知道怎么表达这个标题,所以标题很糟糕,
基本上,我有一个 4 个字母的单词,我想生成在其中放入破折号的每个排列。
因此,如果我的单词是 Cats,我希望它的每个排列都包含破折号,
示例:
c-ats
ca-ts
-c-ats
etc,
有人能帮我吗?
word = input("Enter the word: ")
def insert_into_str(s, index, in_str):
arr = list(s)
arr.insert(index, in_str)
return "".join(arr)
permutations = []
for i in range(len(word)+1):
permutations.append(insert_into_str(word, i, "-"))
print(permutations)
>>> Enter the word: cats
>>> ['-cats', 'c-ats', 'ca-ts', 'cat-s', 'cats-']
我假设您想生成所有可能的方法来将零个或多个连字符插入您的单词 s.t。没有两个连字符相邻。这是使用 itertools.product
:
执行此操作的一种方法
from itertools import product
def hyphens(word):
# create template, each {} is to be filled with "" or "-"
template = "{}" + "{}".join(word) + "{}"
# iterate over all possible ways to fill empty braces
for chars in product(["", "-"], repeat=len(word) + 1):
yield template.format(*chars)
list(hyphens('cats'))
# ['cats', 'cats-', 'cat-s', 'cat-s-', 'ca-ts', 'ca-ts-', 'ca-t-s', 'ca-t-s-',
# 'c-ats', 'c-ats-', 'c-at-s', 'c-at-s-', 'c-a-ts', 'c-a-ts-', 'c-a-t-s',
# 'c-a-t-s-', '-cats', '-cats-', '-cat-s', '-cat-s-', '-ca-ts', '-ca-ts-',
# '-ca-t-s', '-ca-t-s-', '-c-ats', '-c-ats-', '-c-at-s', '-c-at-s-', '-c-a-ts',
# '-c-a-ts-', '-c-a-t-s', '-c-a-t-s-']
这里有一个不用itertools的方法。将二进制字符串解释为放置连字符的位置
def add_hyphens(str):
hyphen_words=[]
a=2**len(str)
b=2**(len(str)+1)
for i in range(a,b,1):
str1=bin(i) #a string 0b1<0's and 1's>
str2=str1[3:] #take off the 0b and the first '1'
tmp_s=""
for j,char1 in enumerate(str):
if str2[j] == '1':
tmp_s =tmp_s + '-'
tmp_s = tmp_s + char1
hyphen_words.append(tmp_s)
hyphen_words.append(tmp_s+'-')
return hyphen_words
print(add_hyphens('cats'))
['cats', 'cats-', 'cat-s', 'cat-s-', 'ca-ts', 'ca-ts-', 'ca-t-s',
'ca-t-s-', 'c-ats', 'c-ats-', 'c-at-s', 'c-at-s-', 'c-a-ts', 'c-
a-ts-', 'c-a-t-s', 'c-a-t-s-', '-cats', '-cats-', '-cat-s', '-
cat-s-', '-ca-ts', '-ca-ts-', '-ca-t-s', '-ca-t-s-', '-c-ats', '-
c-ats-', '-c-at-s', '-c-at-s-', '-c-a-ts', '-c-a-ts-', '-c-a-t-s', '-c-a-t-s-']
不知道怎么表达这个标题,所以标题很糟糕,
基本上,我有一个 4 个字母的单词,我想生成在其中放入破折号的每个排列。
因此,如果我的单词是 Cats,我希望它的每个排列都包含破折号,
示例:
c-ats
ca-ts
-c-ats
etc,
有人能帮我吗?
word = input("Enter the word: ")
def insert_into_str(s, index, in_str):
arr = list(s)
arr.insert(index, in_str)
return "".join(arr)
permutations = []
for i in range(len(word)+1):
permutations.append(insert_into_str(word, i, "-"))
print(permutations)
>>> Enter the word: cats
>>> ['-cats', 'c-ats', 'ca-ts', 'cat-s', 'cats-']
我假设您想生成所有可能的方法来将零个或多个连字符插入您的单词 s.t。没有两个连字符相邻。这是使用 itertools.product
:
from itertools import product
def hyphens(word):
# create template, each {} is to be filled with "" or "-"
template = "{}" + "{}".join(word) + "{}"
# iterate over all possible ways to fill empty braces
for chars in product(["", "-"], repeat=len(word) + 1):
yield template.format(*chars)
list(hyphens('cats'))
# ['cats', 'cats-', 'cat-s', 'cat-s-', 'ca-ts', 'ca-ts-', 'ca-t-s', 'ca-t-s-',
# 'c-ats', 'c-ats-', 'c-at-s', 'c-at-s-', 'c-a-ts', 'c-a-ts-', 'c-a-t-s',
# 'c-a-t-s-', '-cats', '-cats-', '-cat-s', '-cat-s-', '-ca-ts', '-ca-ts-',
# '-ca-t-s', '-ca-t-s-', '-c-ats', '-c-ats-', '-c-at-s', '-c-at-s-', '-c-a-ts',
# '-c-a-ts-', '-c-a-t-s', '-c-a-t-s-']
这里有一个不用itertools的方法。将二进制字符串解释为放置连字符的位置
def add_hyphens(str):
hyphen_words=[]
a=2**len(str)
b=2**(len(str)+1)
for i in range(a,b,1):
str1=bin(i) #a string 0b1<0's and 1's>
str2=str1[3:] #take off the 0b and the first '1'
tmp_s=""
for j,char1 in enumerate(str):
if str2[j] == '1':
tmp_s =tmp_s + '-'
tmp_s = tmp_s + char1
hyphen_words.append(tmp_s)
hyphen_words.append(tmp_s+'-')
return hyphen_words
print(add_hyphens('cats'))
['cats', 'cats-', 'cat-s', 'cat-s-', 'ca-ts', 'ca-ts-', 'ca-t-s',
'ca-t-s-', 'c-ats', 'c-ats-', 'c-at-s', 'c-at-s-', 'c-a-ts', 'c-
a-ts-', 'c-a-t-s', 'c-a-t-s-', '-cats', '-cats-', '-cat-s', '-
cat-s-', '-ca-ts', '-ca-ts-', '-ca-t-s', '-ca-t-s-', '-c-ats', '-
c-ats-', '-c-at-s', '-c-at-s-', '-c-a-ts', '-c-a-ts-', '-c-a-t-s', '-c-a-t-s-']