如何在列表Python中交换列表中的项目

时间:2018-11-14 11:43:25

标签: python list swap

我正在尝试随机交换一个列表中每个列表中的2个项目,其中要交换的项目不在另一个列表中。

这是我的代码

import random    


def swap(mylist):
        remain = [[1, 2], [4], [], [8, 2], [1, 4], [5, 2, 1], [], [9, 5], [7]]
        for x in range(0, 9):
            remaining = set(mylist[x]) - set(remain[x])
            to_swap = random.sample(remaining, 2)
            mylist[x][mylist[x].index(to_swap[0])], mylist[x][mylist[x].index(to_swap[1])] = mylist[x][mylist[x].index(to_swap[1])], mylist[x][mylist[x].index(to_swap[0])]
        return mylist


print(swap([[8, 5, 4, 1, 3, 9, 7, 6, 2], [9, 3, 5, 6, 4, 7, 1, 2, 8], [7, 3, 2, 5, 4, 1, 9, 6, 8], [2, 1, 3, 8, 6, 9, 5, 7, 4], [1, 2, 3, 5, 7, 4, 9, 8, 6], [6, 9, 3, 1, 7, 4, 2, 8, 5], [1, 2, 7, 4, 3, 8, 5, 9, 6], [3, 7, 8, 4, 1, 5, 9, 6, 2], [4, 2, 6, 5, 7, 1, 9, 3, 8]]))

每当我运行并打印出结果时,它只会再次打印出我的输入。

有人知道我的代码有什么问题吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

您的代码与大约一半的子列表执行交换。 我想知道这种行为的原因是什么 *(见下文)。

如果您这样重写交换部分:

    i = mylist[x].index(to_swap[0])
    j = mylist[x].index(to_swap[1])
    mylist[x][i], mylist[x][j] = mylist[x][j], mylist[x][i]

然后它起作用。

更新:

由于我们已经知道这些值,因此无需访问作业右侧的列表,因此更新后的答案将是:

    i = mylist[x].index(to_swap[0])
    j = mylist[x].index(to_swap[1])
    mylist[x][i], mylist[x][j] = to_swap[1], to_swap[0]

*更新2:

上述行为是由于以下事实造成的:在多个分配中,左侧的表达式从左到右一一求值。这意味着在index(to_swap[0]) < index(to_swap[1])的情况下,OP的代码不起作用。

示例:第一个子列表[8, 5, 4, 1, 3, 9, 7, 6, 2]中的值5和6。首先,程序会执行

mylist[x][mylist[x].index(5)] = 6

将列表修改为[8, 6, 4, 1, 3, 9, 7, 6, 2]。其次,程序会执行

mylist[x][mylist[x].index(6)] = 5

将其修改回[8, 5, 4, 1, 3, 9, 7, 6, 2]