为什么 Python 不生成给定字母的所有可能组合?
Why Python does not generate all possible combinations of letters given?
生成文件的使用代码
代码将 return 两个具有可能组合的文件!
最终文件就是要使用的!
使用 itertools 生成可能的字母组合
将元组连接到字符串
将输出映射到字符串
将输出写入文件
正在读取生成的文件并删除不必要的空格
终于测试
文件:test.py
#using itertools generating possible combinations of letters given below and writing it to a file
from itertools import combinations
a = "lida"
letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',]
def Combinations(iterable, size):
result = combinations(iterable, size)
#joining tuple to string
def join_tuple_string(strings_tuple) -> str:
return ' '.join(strings_tuple)
#maping output to string
output = map(join_tuple_string, result)
end = list(output)
#writing the output to a file
with open('file.txt', 'w') as e:
e.write(str(end))
Combinations(letters, 4)
#Reading the generated file and removing uncessary spaces
with open('file.txt', 'r') as e:
a = e.read()
for i in range(len(a)):
list = a[i]
b = list.replace(' ', '')
with open('final.txt', 'a') as f:
f.write(b)
# finally Testing
with open('final.txt', 'r') as r:
file = r.read()
if 'adil' in file:
print('present')
if 'lida' in file:
print('present')
else:
print('not present')
假设您的问题是“为什么在文件数据中找不到 'lida'
而 'adil'
是?”答案是:因为您在任务中使用了错误的 itertools
函数(and/or 误解了它的作用)。
combinations
生成所有 unique 子序列,按输入迭代中的位置排序。由于您的输入 iterable 是按排序顺序排列的,因此您的输出元素也将始终按排序顺序排列; 'abcd'
将存在,但 'abdc'
不会存在,因为 d
在输入中位于 c
之后(a
、b
没有排序, c
和 d
除了 'abcd'
将存在)。如果你想包括所有不同的排列(所以 'adil'
和 'lida'
都出现在输出中),你会想要 itertools.permutations
,而不是 itertools.combinations
。同样,如果您需要一个能够重复的字母(因此 'aaaa'
是一个可能的输出),您需要 combinations_with_replacement
如果只需要根据 combinations
或 product
(带有关键字传递的 repeat
参数)如果您希望所有顺序都按照 permutations
.
请注意,permutations
的输出数量 多 ;我强烈建议不要尝试将它们全部存储在内存中。只需遍历 permutations
对象并 write
它们一个一个地循环,例如:
with open('file.txt', 'w') as e:
perms = map(''.join, permutations(iterable, size)) # map(''.join, ...) is an efficient way to change an iterable of tuples of str to single strs
file.write(f'[{next(perms)!r}') # Write open bracket and pull initial value
# Iterate over remaining values
for perm in perms:
file.write(f',{perm!r}') # Write comma and new value
file.write(']') # Write close bracket
仍然会在文件中生成合法的 list
文字,并避免添加任何您一开始就试图避免的空格,所有这些都不会破坏您的 RAM 试图将所有排列保存在一次。
生成文件的使用代码
代码将 return 两个具有可能组合的文件!
最终文件就是要使用的!
使用 itertools 生成可能的字母组合
将元组连接到字符串
将输出映射到字符串
将输出写入文件
正在读取生成的文件并删除不必要的空格
终于测试
文件:test.py
#using itertools generating possible combinations of letters given below and writing it to a file
from itertools import combinations
a = "lida"
letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',]
def Combinations(iterable, size):
result = combinations(iterable, size)
#joining tuple to string
def join_tuple_string(strings_tuple) -> str:
return ' '.join(strings_tuple)
#maping output to string
output = map(join_tuple_string, result)
end = list(output)
#writing the output to a file
with open('file.txt', 'w') as e:
e.write(str(end))
Combinations(letters, 4)
#Reading the generated file and removing uncessary spaces
with open('file.txt', 'r') as e:
a = e.read()
for i in range(len(a)):
list = a[i]
b = list.replace(' ', '')
with open('final.txt', 'a') as f:
f.write(b)
# finally Testing
with open('final.txt', 'r') as r:
file = r.read()
if 'adil' in file:
print('present')
if 'lida' in file:
print('present')
else:
print('not present')
假设您的问题是“为什么在文件数据中找不到 'lida'
而 'adil'
是?”答案是:因为您在任务中使用了错误的 itertools
函数(and/or 误解了它的作用)。
combinations
生成所有 unique 子序列,按输入迭代中的位置排序。由于您的输入 iterable 是按排序顺序排列的,因此您的输出元素也将始终按排序顺序排列; 'abcd'
将存在,但 'abdc'
不会存在,因为 d
在输入中位于 c
之后(a
、b
没有排序, c
和 d
除了 'abcd'
将存在)。如果你想包括所有不同的排列(所以 'adil'
和 'lida'
都出现在输出中),你会想要 itertools.permutations
,而不是 itertools.combinations
。同样,如果您需要一个能够重复的字母(因此 'aaaa'
是一个可能的输出),您需要 combinations_with_replacement
如果只需要根据 combinations
或 product
(带有关键字传递的 repeat
参数)如果您希望所有顺序都按照 permutations
.
请注意,permutations
的输出数量 多 ;我强烈建议不要尝试将它们全部存储在内存中。只需遍历 permutations
对象并 write
它们一个一个地循环,例如:
with open('file.txt', 'w') as e:
perms = map(''.join, permutations(iterable, size)) # map(''.join, ...) is an efficient way to change an iterable of tuples of str to single strs
file.write(f'[{next(perms)!r}') # Write open bracket and pull initial value
# Iterate over remaining values
for perm in perms:
file.write(f',{perm!r}') # Write comma and new value
file.write(']') # Write close bracket
仍然会在文件中生成合法的 list
文字,并避免添加任何您一开始就试图避免的空格,所有这些都不会破坏您的 RAM 试图将所有排列保存在一次。