MAU*_*UCA 0 python string loops for-loop list
我正在研究如何使用for循环等等,我正试图想出一种方法来使一串相似的字符排序,这样就不会重复任何字符
# string of characters
chars = 'abbbababa'
# my idea was to make it an enumerated string
charsnum = enumerate(chars)
# while doing that I discovered the following
chars = 'babbbaba'
for i in charsnum:
for j in charsnum:
for z in charsnum:
for k in charsnum:
print(i,j,z,k)
# each time I add a loop the string becomes shorter
(0, 'b') (1, 'a') (2, 'b') (3, 'b')
(0, 'b') (1, 'a') (2, 'b') (4, 'b')
(0, 'b') (1, 'a') (2, 'b') (5, 'a')
(0, 'b') (1, 'a') (2, 'b') (6, 'b')
(0, 'b') (1, 'a') (2, 'b') (7, 'a')
Run Code Online (Sandbox Code Playgroud)
我知道第一个循环遍历charsnum中的所有值,但循环迭代的第二个,第三个等等是什么?另外,将我的字符串'babbbaba'变成'bababababa'或'ababababa'之类的字符串可能是一个很好的解决方案.
你问几个for环路,所有在同一单个迭代器迭代.您没有创建副本,它们共享一个对象.
外环前进charsnum一步对象,那么下一个for循环进入它一旦开始其迭代,等等.最里面的for循环使剩余的项目迭代,当你返回for z循环时,没有任何东西可以迭代.
你可以做同样的事情,像函数一样推进迭代器for,使用next()函数:
>>> chars = 'abbbababa'
>>> charsnum = enumerate(chars)
>>> i = next(charsnum)
>>> j = next(charsnum)
>>> z = next(charsnum)
>>> k = next(charsnum)
>>> i, j, z, k
((0, 'a'), (1, 'b'), (2, 'b'), (3, 'b'))
>>> next(charsnum) # next k value in the innermost loop
(4, 'a')
>>> # etc. etc.
Run Code Online (Sandbox Code Playgroud)
您可以enumerate()为每个for循环创建单独的对象:
for i in enumerate(chars):
for j in enumerate(chars):
for z in enumerate(chars):
for k in enumerate(chars):
print(i,j,z,k)
Run Code Online (Sandbox Code Playgroud)
但这比你需要的还多.对于重复相同迭代的嵌套循环,使用itertools.product()并告诉它重复; 它会根据需要保留副本:
from itertools import product
for i, j, z, k in product(enumerate(chars), repeat=4):
print(i, j, z, k)
Run Code Online (Sandbox Code Playgroud)
但是,这不会消除重复的字符; 这会(index, char)从你的char字符串中产生所有可能的元组中的4个元组的笛卡尔积.
您可能希望从独特的字母创建排列,并将这些模式的字符串排成相同的长度:
from itertools import permutations
for pattern in permutations(set(chars)):
repeat = (len(chars) + 1) // len(pattern)
result = (''.join(pattern) * repeat)[:len(chars)]
print(result)
Run Code Online (Sandbox Code Playgroud)
这产生了
babababab
ababababa
Run Code Online (Sandbox Code Playgroud)