首页 > 解决方案 > 如何从列表中删除项目并将其添加到同一列表的末尾

问题描述

我有一个 52 个元组(一副扑克牌)的列表,我试图在不使用 random.shuffle 的情况下洗牌(不允许在这个项目中使用它)。我想要做的是创建 2 个随机索引,从列表中删除这些项目,并将 1 放在列表的前面,将 1 放在列表的末尾。

我可以创建随机#,但不知道如何移动它们。似乎 .pop 是我最好的方法,但不确定这是否正确。

def shuffle():
    ite = 0
    while ite <= 1000:
        rand1 = randint(0, len(card_deck) -1)
        rand2 = randint(0, len(card_deck) -1)
        card_deck.pop[rand1]
        card_deck.append(rand1)
        ite += 1
shuffle()

标签: pythonlistshuffle

解决方案


Pop 的时间复杂度在这种情况下并不理想。将 rand1 中的值存储为临时变量并将其替换为 rand2 中的值,然后将 rand2 中的值替换为临时变量会更有意义。正如下面评论中提到的,更有效的是,您可以在没有临时变量的情况下交换两个值。

例如,如果您有一个包含 1000 个项目的列表,并且您想弹出第 500 个项目,它将在 N(500) 时间内运行。而您可以在恒定时间内访问列表中的项目。

如果您将此作为家庭作业,请尽量不要在没有自己实施的情况下查看下面的答案。

def shuffle():
    ite = 0
    while ite <= 1000:
        rand1 = randint(0, len(card_deck) - 1)
        rand2 = randint(0, len(card_deck) - 1)
        card_deck[rand1], card_deck[rand2] = card_deck[rand2], card_deck[rand1]
        ite += 1

推荐阅读