2

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)没有附加这些变体。相反,init_list在第 5 行创建的 as 被重复附加到var_list.

这里发生了什么?以及如何init_list将 while 循环中创建的不同变体附加到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']]
4

2 回答 2

6

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

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)))
于 2013-10-14T06:01:58.533 回答
3

有了这条线

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
于 2013-10-14T05:59:16.173 回答