'module' object has no attribute 'choice' - trying to use random.choice
Asked Answered
O

6

31

Could someone please tell me what I may be doing wrong. I keep getting this message when I run my python code:

import random

foo = ['a', 'b', 'c', 'd', 'e']

random_item = random.choice(foo)

print random_item

Error

AttributeError: 'module' object has no attribute 'choice'

Organogenesis answered 5/9, 2014 at 23:45 Comment(7)
What exactly do u want to do please?Sachi
@Sachi They want to choose a random item from their list foo, is that not obvious?Surface
The code works perfectly for me... Which version of python you are using? And which os?Sachi
It's obvious that it's working for you, but the possible problem is explained twice in the answers ;)Ectoblast
I'm running the latest version of pyCharm community editionOrganogenesis
@AMHD: That doesn't explain either of the two questions that mlwn asked, since PyCharm works with a wide range of Python versions, on at least 3 different OSs.Jessiejessika
Another possibility is that you might have an older version of numpy. Upgrade with: sudo pip install numpy --upgradeBacklash
S
89

Shot in the dark: You probably named your script random.py. Do not name your script the same name as the module.

I say this because the random module indeed has a choice method, so the import is probably grabbing the wrong (read: undesired) module.

Surface answered 5/9, 2014 at 23:48 Comment(3)
If this doesn't fix it, check for a random.pyc file as well.Stow
It may be a shot in the dark, but it is an impressive shot in the dark nonetheless. +1 (Also, for the record, having a name of math.py causes the same problem)Municipality
this totally saved meRooky
D
18

The problem in my case was I used random.choices() with python 3.5. However, it is available from python 3.6 onwards.

Instead, use random.sample() without the weights or cum_weights attributes you would specify in random.choices() if you are using python 3.5 and 2.7. Documentation is here.

Dowzall answered 8/5, 2018 at 6:17 Comment(2)
use "random.sample"Virge
random.sample worked for me when my production server was using python3.5. No code changes needed. Just add it. Of course please test your code before doing this.Orient
T
7

Sounds like an import issue. Is there another module in the same directory named random? If so (and if you're on python2, which is obvious from print random_item) then it's importing that instead. Try not to shadow built-in names.

You can test this with the following code:

import random

print random.__file__

The actual random.py module from stdlib lives in path/to/python/lib/random.py. If yours is somewhere else, this will tell you where it is.

Thimbu answered 5/9, 2014 at 23:48 Comment(6)
Isn't it normally path/to/python/lib/pythonX.Y/random.py (unless he's using a really old Python, I think before 2.3 or so)? Also, I don't think 2.7 gives you the .py file even if there's a .pyc the way 3.3+ does, so probably random.pyc, but I could be misremembering that. But other than that little nitpicky bit, great answer.Jessiejessika
I saved my file is on my desktop.Organogenesis
@Jessiejessika I tested on my Python3.3 and got "C:\Python33\lib\random.py"Thimbu
@AdamSmith: Oh yeah, on Windows it leaves off the pythonX.Y directory because the top-level directory is already PythonXY.Jessiejessika
It gives me SyntaxError: Missing parentheses in call to 'print'Likelihood
@Marine1 The OP on this question was running Python2, in which python is a statement not a function and requires no parentheses.Thimbu
I
4

I also got this error by naming a method random like this:

import random

def random():

  foo = ['a', 'b', 'c', 'd', 'e']

  random_item = random.choice(foo)

  print random_item

random()

It's not your case (naming a file random.py) but for others that search about this error and may make this mistake.

Intensifier answered 25/4, 2016 at 9:44 Comment(0)
W
3

In short, Python's looking in the first file it finds named "random", and isn't finding the choice attribute.

99.99% of the time, that means you've got a file in the path/directory that's already named "random". If that's true, rename it and try again. It should work.

Waring answered 30/11, 2014 at 20:40 Comment(0)
M
1

If you are using Python older than 3.6 version, than you have to use NumPy library to achieve weighted random numbers. With the help of choice() method, we can get the random samples of one dimensional array and return the random samples of numpy array.


from numpy.random import choice
  
sampleList = [100, 200, 300, 400, 500]
randomNumberList = choice(
  sampleList, 5, p=[0.05, 0.1, 0.15, 0.20, 0.5])
  
print(randomNumberList)

source : geeksforgeek

Michi answered 8/3, 2022 at 11:36 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.