I'm a newbie so please bear with me:
import random
directions = ['north', 'east', 'south', 'west']
bad_directions = directions[:]
good_direction = random.sample(directions,1)
good_direction = str(good_direction).replace('[','').replace(']','')
bad_directions.remove(good_direction)
print bad_directions
This raises ValueError:
Traceback (most recent call last):
File "directions.py", line 9, in <module>
bad_directions.remove(good_direction)
ValueError: list.remove(x): x not in list
I tried checking the types of "good_direction" and "bad_directions[1]" just to see if they're the same and they're both string.
Please put [0] here :
good_direction = random.sample(directions,1)[0]
I think this line is overkill and error prone:
good_direction = str(good_direction).replace('[','').replace(']','')
If you want to retrieve the string returned by random.sample(directions,1)
you can just do:
good_direction=random.sample(directions,1)[0]
Your code is failing because you're missing to replace
something from the retrieved string.
I followed your code and the resulting string after the replacement was "'abc'"
:
>>>import random
>>>l=['abc' for i in range(10)]
>>>s=random.sample(l,1)
>>>s
['abc']
>>>str(s)
"['abc']"
>>>s1=str(s).replace('[','').replace(']','')
>>>s1
"'abc'" # auch! the single quotes remain there!
>>>s1 in l
False
good directions per your code returns a different string than whats in the directions list. Below is the output.
>>> good_direction
"'east'"
>>> good_direction
"'east'"
>>> good_direction in directions
False
——— may be the below peice of code will achieve what you are trying to achieve.
>>> good_direction = random.choice(directions)
>>> good_direction
'east'
>>> bad_directions.remove(good_direction)
>>> print bad_directions
['north', 'south', 'west']
The deepcopy is there to make an exact deepcopy version of directions. I don't know if you need it, I just added it.
# your code goes here
import random
import copy
directions = ['north', 'east', 'south', 'west']
bad_directions = copy.deepcopy(directions)
good_directions = random.choice(directions)
bad_directions.remove(good_directions)
print good_directions,bad_directions
If you don't need the deepcopy, then you also don't need to keep directions the original list. It can then be made easier as follows:
# your code goes here
import random
bad_directions = ['north', 'east', 'south', 'west']
good_directions = random.choice(bad_directions)
bad_directions.remove(good_directions)
print good_directions,bad_directions
Here is another way to do that:
import random
directions = ['north', 'east', 'south', 'west']
index = random.randrange (len (directions)) # number 0, 1, 2 or 3
good_direction = directions[index]
bad_directions = directions[:index] + directions[index + 1:] # all but directions[index]
print good_direction
print bad_directions
An example output is:
south
['north', 'east', 'west']
You can discard the lines for finding good_direction
if you need only bad_directions
.
You can do that differently:
bad_directions.pop(random.randrange(len(bad_directions)))
or
del(bad_directions[random.randrange(len(bad_directions))])
I agree with previous post - it does look like a massive overkill to convert list to string then normalize and then work with it.
I'm a newbie so please bear with me:
import random
directions = ['north', 'east', 'south', 'west']
bad_directions = directions[:]
good_direction = random.sample(directions,1)
good_direction = str(good_direction).replace('[','').replace(']','')
bad_directions.remove(good_direction)
print bad_directions
This raises ValueError:
Traceback (most recent call last):
File "directions.py", line 9, in <module>
bad_directions.remove(good_direction)
ValueError: list.remove(x): x not in list
I tried checking the types of "good_direction" and "bad_directions[1]" just to see if they're the same and they're both string.
Please put [0] here :
good_direction = random.sample(directions,1)[0]
I think this line is overkill and error prone:
good_direction = str(good_direction).replace('[','').replace(']','')
If you want to retrieve the string returned by random.sample(directions,1)
you can just do:
good_direction=random.sample(directions,1)[0]
Your code is failing because you're missing to replace
something from the retrieved string.
I followed your code and the resulting string after the replacement was "'abc'"
:
>>>import random
>>>l=['abc' for i in range(10)]
>>>s=random.sample(l,1)
>>>s
['abc']
>>>str(s)
"['abc']"
>>>s1=str(s).replace('[','').replace(']','')
>>>s1
"'abc'" # auch! the single quotes remain there!
>>>s1 in l
False
good directions per your code returns a different string than whats in the directions list. Below is the output.
>>> good_direction
"'east'"
>>> good_direction
"'east'"
>>> good_direction in directions
False
——— may be the below peice of code will achieve what you are trying to achieve.
>>> good_direction = random.choice(directions)
>>> good_direction
'east'
>>> bad_directions.remove(good_direction)
>>> print bad_directions
['north', 'south', 'west']
The deepcopy is there to make an exact deepcopy version of directions. I don't know if you need it, I just added it.
# your code goes here
import random
import copy
directions = ['north', 'east', 'south', 'west']
bad_directions = copy.deepcopy(directions)
good_directions = random.choice(directions)
bad_directions.remove(good_directions)
print good_directions,bad_directions
If you don't need the deepcopy, then you also don't need to keep directions the original list. It can then be made easier as follows:
# your code goes here
import random
bad_directions = ['north', 'east', 'south', 'west']
good_directions = random.choice(bad_directions)
bad_directions.remove(good_directions)
print good_directions,bad_directions
Here is another way to do that:
import random
directions = ['north', 'east', 'south', 'west']
index = random.randrange (len (directions)) # number 0, 1, 2 or 3
good_direction = directions[index]
bad_directions = directions[:index] + directions[index + 1:] # all but directions[index]
print good_direction
print bad_directions
An example output is:
south
['north', 'east', 'west']
You can discard the lines for finding good_direction
if you need only bad_directions
.
You can do that differently:
bad_directions.pop(random.randrange(len(bad_directions)))
or
del(bad_directions[random.randrange(len(bad_directions))])
I agree with previous post - it does look like a massive overkill to convert list to string then normalize and then work with it.
0 commentaires:
Enregistrer un commentaire