0

I'm trying to create draws without replacement, and output the result of each draw as a text file. The list is in a separate file, and I want to re-import it for each iteration of my loop

import random
import numberlist

counter=0
draws= 100
while (counter<draws):
    x=  numberlist.listX     #this imports a list of strings eg. ['a341','c32k','42b]]

    random.shuffle(x)     

    x.pop()
    """OPERATIONS WITH POPPED VALUE"""

    counter += 1

What I was hoping for was that X would be realitialized to the the complete listX at the beginning of every loop iteration. Instead what I"m finding is that every time I pop a number, the list gets smaller every loop iteration. Why is this happening, and how can I get around it?

Thank you.

4

2 回答 2

4

You must use a shallow copy of the list:

x=  numberlist.listX[:]  #or list(numberlist.listX)

Using just x= numberlist.listX only creates a new reference to the same object.

Example:

In [1]: lis=[1,2,3]

In [2]: x=lis

In [3]: x is lis  #both point to the same object
Out[3]: True

In [4]: x=lis[:]  #create a shallow copy

In [5]: x is lis 
Out[5]: False

I think you can replace your while loop with this:

for item in (random.choice(lis) for _ in xrange(draws)):
    #do something with item
于 2013-04-30T21:08:29.553 回答
0

As shown here when pop is called in a list it removes the item at the given position in the list, and return it.

Considering you are creating a new reference to the same object using

x= numberlist.listX 

as said above, it is expected that the list will not have the same elements in each loop iteration.

My suggestion is to do something like:

import random

counter=0
draws= 100
xlist = ['a341','c32k','42b']
while (counter<draws):
    x = xlist

    random.shuffle(x)     

    print x[-1]
    """OPERATIONS WITH POPPED VALUE"""

    counter += 1

where

x[-1]

just returns the last element of the list.

于 2013-04-30T21:29:38.060 回答