Python-在while循环期间将列表附加到列表-结果与预期不符[重复]

Posted

技术标签:

【中文标题】Python-在while循环期间将列表附加到列表-结果与预期不符[重复]【英文标题】:Python - Appending list to list during while loop - Result not as expected [duplicate] 【发布时间】:2013-10-21 15:51:40 【问题描述】:

Python/编程新手在这里,试图弄清楚这个 while 循环发生了什么。先上代码:

var_list = []
split_string = "pink penguins,green shirts,blue jeans,fried tasty chicken,old-style boots"

def create_variations(split_string):
    init_list = split_string.split(',')
    first_element = init_list[0]

    # change first element of list to prepare for while loop iterations
    popped = init_list.pop()
    added = init_list.insert(0, popped)

    while init_list[0] != first_element:
        popped = init_list.pop()
        added = init_list.insert(0, popped)
        print init_list # prints as expected, with popped element inserted to index[0] on each iteration
        var_list.append(init_list) # keeps appending the same 'init_list' as defined on line 5, not those altered in the loop!

    print var_list

create_variations(split_string)

我的目标是创建init_list 的所有变体,这意味着索引会旋转,以便每个索引仅出现一次。然后将这些变体附加到另一个列表中,即此代码中的 var_list

但是,我没有从 while 循环中得到我期望的结果。在while循环中,代码print init_list实际上打印了我想要的变化;但是下一行代码var_list.append(init_list) 没有附加这些变体。相反,在第 5 行创建的 init_list 会重复附加到 var_list

这里发生了什么?以及如何获得在 while 循环中创建的 init_list 的不同变体以附加到 var_list

我期望 var_list 的输出:

[['fried tasty chicken', 'old-style boots', 'pink penguins', 'green shirts', 'blue jeans'],
 ['blue jeans', 'fried tasty chicken', 'old-style boots', 'pink penguins', 'green shirts'],
 ['green shirts', 'blue jeans', 'fried tasty chicken', 'old-style boots', 'pink penguins'],
 ['pink penguins', 'green shirts', 'blue jeans', 'fried tasty chicken', 'old-style boots']]

【问题讨论】:

能否请您提供预期和实际输出? 看看collections.deque。 @thefourtheye 我添加了预期的输出。 输出结果有点奇怪。它错过了['老式靴子'、'粉红企鹅'、'绿色衬衫'、'蓝色牛仔裤'、'炸鸡']。看起来不对。 【参考方案1】:

这里有一些代码以更简单的方式完成我认为你想要的:

variations = []
items = [1,2,3,4,5]

for i in range(len(items)):
    v = items[i:] + items[:i]
    variations.append(v)

print variations

输出:

[[1, 2, 3, 4, 5], [2, 3, 4, 5, 1], [3, 4, 5, 1, 2], [4, 5, 1, 2, 3], [5, 1, 2, 3, 4]]

或者你可以使用这个简单的生成器:

(items[i:] + items[:i] for i in range(len(items)))

【讨论】:

感谢您提供这些更好的代码。我还没有使用/研究过生成器,现在我可以继续阅读该主题了。全部在 1 行中 :-)【参考方案2】:

用这条线

var_list.append(init_list)

您每次都在添加对init_list 的引用。但是您需要创建一个新列表。使用这个

var_list.append(init_list[:])

说明

当您打印init_list 时,它会打印当前状态。当您将其添加到 var_list 时,您并未添加当前状态。您正在添加参考。因此,当实际列表发生变化时,所有引用都指向相同的数据。

你可以像这样简化你的程序

def create_variations(split_string):
    init_list = split_string.split(', ')
    for i in range(len(init_list)):
        var_list.append(init_list[:])
        init_list.insert(0, init_list.pop())

    print var_list

【讨论】:

感谢您为我解决这个问题。虽然 print init_list 在 while 循环中打印了变化,但 init_list 实际上并没有改变,所以我仍然有点困惑,因此需要添加 [:]。但现在我知道我需要在循环时这样做。 当你打印它时,它会打印当前状态。添加时,您不会添加当前状态。您正在添加参考。因此,当实际列表发生变化时,所有引用都指向相同的数据。 在 Python 3.3+ 中现在有一个 list.copy() 方法。做同样事情的更清晰的语法。

以上是关于Python-在while循环期间将列表附加到列表-结果与预期不符[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Python For循环仅将最后一个值附加到列表

为每个循环附加到一个新列表

将列表附加到 R 中的列表列表

在每次迭代期间将新值附加到列表中后,将列表值添加到字典中

附加列表的结束循环

如何使用循环将带有来自 googlesearch 的链接的列表附加到另一个列表?