while循环中的单个remove子句正在删除两个元素

2024-05-19 20:12:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在写一个简单的秘密圣诞老人脚本,从列表中选择一个“礼物接收者”和一个“礼物接收者”。生成两个列表和一个要填充的空数据帧:

import pandas as pd
import random

santaslist_receivers = ['Rudolf',
        'Blitzen',
        'Prancer',
        'Dasher',
        'Vixen',
        'Comet'
        ]

santaslist_givers = santaslist_receivers

finalDataFrame = pd.DataFrame(columns = ['GiftGiver','GiftReceiver'])

然后我有一个while循环,从每个列表中选择随机元素来选择送礼者和接收者,然后从相应的列表中删除:

while len(santaslist_receivers) > 0:

    print (len(santaslist_receivers)) #Used for testing.

    gift_receiver = random.choice(santaslist_receivers)
    santaslist_receivers.remove(gift_receiver)

    print (len(santaslist_receivers)) #Used for testing.

    gift_giver = random.choice(santaslist_givers)
    while gift_giver == gift_receiver:                      #While loop ensures that gift_giver != gift_receiver
        gift_giver = random.choice(santaslist_givers)

    santaslist_givers.remove(gift_giver)

    dummyDF = pd.DataFrame({'GiftGiver':gift_giver,'GiftReceiver':gift_receiver}, index = [0])

    finalDataFrame = finalDataFrame.append(dummyDF)

最后的数据帧只包含三个元素,而不是六个:

print(finalDataframe)

退货

    GiftGiver GiftReceiver
0    Dasher      Prancer
0     Comet        Vixen
0    Rudolf      Blitzen

我在while循环中插入了两行打印行以进行调查。它们打印删除元素前后的列表长度。预期的结果是在第一次打印时看到原始列表长度,然后在第二次打印时看到-1,然后在while循环的下一次迭代的第一次打印时看到相同的长度,依此类推。具体来说,我希望:

6,5,5,4,4,3,3... and so on.

返回的是

6,5,4,3,2,1

这与只有3行的数据帧是一致的,但我看不出原因

我的代码或方法中有什么错误


Tags: 数据列表randompdreceiverwhile接收者gift
2条回答

你只要改变这条线就可以解决这个问题

santaslist_givers = santaslist_receivers

 santaslist_givers = list(santaslist_receivers)

Python变量本质上是指针,因此它们引用相同的列表,即santaslist_giverssantaslist_receivers在实现中访问内存中的相同位置。要使它们不同,请使用list函数

更多信息,请参考^{}

你应该在这里把你的单子复印一份

santaslist_givers = santaslist_receivers

this question中所述,有多种方法可供选择

在这种情况下,我建议(如果您有Python>;=(第3.3节):

santaslist_givers = santaslist_receivers.copy()

如果您使用的是较旧版本的Python,典型的方法是:

santaslist_givers = santaslist_receivers[:]

相关问题 更多 >