【问题标题】:nested for loops in python - can some one explainpython中的嵌套for循环 - 有人可以解释一下吗
【发布时间】:2018-03-09 09:52:51
【问题描述】:

我正在研究如何使用 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')

我知道第一个循环 迭代 遍历 charsnum 中的所有值,但是第二个、第三个等 for 循环遍历的内容是什么? 此外,将我的字符串 'babbbaba' 变成没有重复值的字符串 'bababbaba' 或 'ababababa' 可能是一个很好的解决方案。

【问题讨论】:

  • 你基本上一直进入同一个循环,没有意义。

标签: python string list loops for-loop


【解决方案1】:

您的问题和示例确实令人困惑,我认为这就是您要寻找的。​​p>

一种更简单的方法是使用列表推导式,它将以更紧凑、pythonic 的方式遍历您的字符集。

chars = 'abbbababa'
print( [i for i in chars] )

结果:

a
b
b
b
a
b
a
b

现在您可以遍历您的索引以检查它们是否与前一个相同。

win = [i for i in chars]      # Convert chars string to a list of chars
last = ''                     # Create a variable to hold our last result
for i in win:
    if i != last:
        print(i)
    last = i                  # Set last to equal the last char iterated

结果:

a
b
a
b
a
b
a

或者如果你想将它们打印在一个字符串中......

win = [i for i in chars]      # Convert chars string to a list of chars
last = ''                     # Create a variable to hold our last result
newchars = ''
for i in win:
    if i != last:
        newchars += i
    last = i                  # Set last to equal the last char iterated
print(newchars)

结果

abababa

【讨论】:

    【解决方案2】:

    您要求多个for 循环all 迭代相同的单个迭代器。您没有创建副本,它们共享一个对象。

    外部循环将charsnum 对象前移一步,然后下一个for 循环将其前移一次以开始 迭代,依此类推。最里面的 for 循环将剩余的项目进行迭代,当您返回到 for z 循环时,没有任何东西可以迭代。

    你可以做同样的事情,像for 那样推进迭代器,使用next() function

    >>> 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.
    

    您可以为每个 for 循环创建单独的 enumerate() 对象:

    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)
    

    但这只是比你需要的更多的工作。对于重复相同迭代的嵌套循环,使用itertools.product() 并告诉它重复;它会根据需要保留副本:

    from itertools import product
    
    for i, j, z, k in product(enumerate(chars), repeat=4):
        print(i, j, z, k)
    

    但是,这不会消除重复的字符;这会从您的 char 字符串中的所有可能的此类元组中产生 4 个 (index, char) 元组的笛卡尔积。

    您可能希望从唯一字母创建排列,并将这些模式串成相同长度的东西:

    from itertools import permutations
    
    for pattern in permutations(set(chars)):
        repeat = (len(chars) + 1) // len(pattern)
        result = (''.join(pattern) * repeat)[:len(chars)]
        print(result)
    

    这会产生

    babababab
    ababababa
    

    【讨论】:

    • 您好,感谢您的帮助!我对python有点陌生,每次问题变得更加复杂并且没有计算机科学背景时,这有点困难。你的代码的最后一部分 [:len(chars)] 在排列中,它正在从 char 中删除字符,因为你正在切片它?
    • @MauricioCastaneda:是的;切片是必需的,因为 chars 中的唯一字符数不一定完全划分为 chars 的长度。在您的示例中,chars 的长度为 9,具有 2 个唯一字符。因此代码生成长度为 10 的输出(2 个字符重复 5 次),然后将其切回 9。
    【解决方案3】:

    “问题”不在for 循环,而是在charsnum。对象charsnum 是一个生成器,每次调用它都会产生下一个值。

    在第一个 for 循环 (for j in charsnum) 中,它会生成 chars 中的第一项,但在内部循环 (for z in charsnum) 中,charsnum 将生成 chars 中的下一项。所以这个内部循环永远不会访问chars 中的第一项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-14
      • 1970-01-01
      • 2020-06-14
      • 1970-01-01
      • 1970-01-01
      • 2020-08-16
      • 1970-01-01
      相关资源
      最近更新 更多