süre döngü tek kaldırma maddesi iki eleman kaldırıyor

oy
0

Ben bir GiftReceiver ve listeden GiftGiver seçer basit bir sır Santa senaryoyu yazıyorum. İki listeleri ve boş dataframe üretilmektedir doldurulması:

import pandas as pd
import random

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

santaslist_givers = santaslist_receivers

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

Daha sonra, daha sonra, bir hediye vereni ve alıcı çekme ilgili listesinden kaldırmak için her listeden rasgele elemanları seçer bir süre döngü vardır:

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)

Nihai dataframe sadece altı yerine üç unsuru içerir:

print(finalDataframe)

döner

    GiftGiver GiftReceiver
0    Dasher      Prancer
0     Comet        Vixen
0    Rudolf      Blitzen

Araştırmak süre döngü içinde iki baskı hatları taktınız. Bunlar önce ve bir öğenin çıkarılmasından sonra liste santaslist_receivers uzunluğunu yazdırın. beklenen getiri böylece daha sonra ise döngünün sonraki yineleme birinci baskının yine ikinci baskıda 1 eksi sonra, birinci baskının ardından aynı uzunlukta orijinal liste uzunluğunu görmektir. Özellikle beklediğim:

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

Ne döndürülür olduğunu

6,5,4,3,2,1

Hangi sadece 3 satır sahip DataFrame ile tutarlıdır, ancak bu nedenini göremiyorum.

Benim kod veya yaklaşımımda hatası nedir?

Oluştur 08/11/2018 saat 11:21
kaynak kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
2

Sadece bu satırı değiştirerek bunu çözebilir

santaslist_givers = santaslist_receivers

için

 santaslist_givers = list(santaslist_receivers)

Python değişkenleri aynı liste, yani atıfta esasen böylece işaretçileri santaslist_giversve santaslist_receiversuygulamanızda bellekte aynı konuma erişen bulundu. Onları farklı kullanımı yapmak için listfonksiyon

Ve bazı ekstra bilgi için, sen başvurabilirsiniz copy.deepcopy

Cevap 08/11/2018 saat 11:48
kaynak kullanıcı

oy
0

Burada listenizin açık bir kopyasını yapmak gerekir

santaslist_givers = santaslist_receivers

olarak açıklanmıştır Bunu yapmak için birden fazla seçenek vardır bu soruya .

Bu durumda ben öneriyoruz (eğer> = 3.3 Python varsa):

santaslist_givers = santaslist_receivers.copy()

Eğer Python eski bir sürümü üzerinde ise, bunu yapmak için tipik bir yoludur:

santaslist_givers = santaslist_receivers[:]
Cevap 08/11/2018 saat 11:55
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more