我正在编写一个简单的秘密圣诞老人脚本,该脚本从列表中选择“ GiftReceiver”和“ GiftGiver”。产生两个列表和一个要填充的空数据框:
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循环中插入了两条打印行以进行调查。它们在删除元素之前和之后显示列表santaslist_receivers的长度。预期的收益是在第一个打印中看到原始列表的长度,然后在第二个打印中看到负1,然后在while循环的下一次迭代的第一个打印中再次看到相同的长度,依此类推。我特别希望:
6,5,5,4,4,3,3... and so on.
返回的是
6,5,4,3,2,1
这与只有3行的DataFrame是一致的,但是我看不出其原因。
我的代码或方法有什么错误?
答案 0 :(得分:2)
您只需更改此行即可解决
santaslist_givers = santaslist_receivers
到
santaslist_givers = list(santaslist_receivers)
Python变量实质上是指针,因此它们引用相同的列表,即santaslist_givers
和santaslist_receivers
在实现中访问内存中的相同位置。要使它们与众不同,请使用list
函数
有关其他信息,您可以参考copy.deepcopy
答案 1 :(得分:0)
您应该在此处明确列出您的列表
santaslist_givers = santaslist_receivers
如this question中所述,有多种选择。
在这种情况下,我建议(如果您的Python> = 3.3):
santaslist_givers = santaslist_receivers.copy()
如果您使用的是旧版本的Python,则典型的实现方法是:
santaslist_givers = santaslist_receivers[:]