0

I want to use random.choice() to choose 5 value from first column in csv as bandwidth. After running the program, the result is 5 identical values. What's wrong with my program?

I have tried random.sample(), but it doesn't work with the Error ' in sample raise ValueError("Sample larger than population or is negative") '. So i just want to use random.choice(), it did not report an error, but extracted 5 duplicate values.

with open('/home/wifi.csv', 'r') as fp:
    reader = csv.reader(fp)
    data = [row for row in reader]
    random.choice(data)

 #choose 5 value from first column as bandwidth
    bw = random.choice(data)[0]*5 
    print(bw)

I expect the output is' 4.5 3.7 2.6 1.8 3.1 ' but the actual output is ' 4.5 4.5 4.5 4.5 4.5 '

Alec
  • 8,529
  • 8
  • 37
  • 63
Lingjie Ji
  • 11
  • 3
  • Related: https://stackoverflow.com/questions/240178/list-of-lists-changes-reflected-across-sublists-unexpectedly – Peter O. May 16 '19 at 15:22

2 Answers2

1

Multiplying a list by an integer N duplicates that list N times, which you saw:

In [4]: [1] * 5
Out[4]: [1, 1, 1, 1, 1]

What you want to do instead is do the random.choice multiple times. You can do that in a loop, or in something like a list comprehension as below:

In [5]: x = list(range(10))

In [6]: [random.choice(x) for _ in range(10)]
Out[6]: [2, 1, 5, 7, 5, 5, 7, 3, 2, 5]
Randy
  • 14,349
  • 2
  • 36
  • 42
0

What you did was select one choice, and multiply it by 5.

['choice']*5

denotes

['choice', 'choice', 'choice', 'choice', 'choice']

What you actually want to do is call random.choice() 5 separate times, and append the result to a list:

for _ in range(5): results.append(random.choice(dataset))

Which can be simplified with a list comprehension:

[random.choice(dataset) for _ in range(5)]
Alec
  • 8,529
  • 8
  • 37
  • 63