2014-01-14 82 views
1

我想在Python中创建一个小程序,它从列表中选取一个随机字符串并打印字符串。但是程序通常会选择相同的字符串两次。Python只输出一次随机/选择一个字符串

有没有办法确保每个字符串只输出一次?

我迄今为止代码:

from random import choice 
food = ['apple', 'banana', 'strawberry', 'blueberry', 'orange'] 
print 'You should eat today :' + choice(food) 
print 'You should eat tomorrow :' + choice(food) 
+0

尝试类似 - 在食品foodItem:打印foodItem – acutesoftware

回答

3
today = choice(food) 
tomorrow = today 
while tomorrow == today: 
    tomorrow = choice(food) 
print 'You should eat today : {}'.format(today) 
print 'You should eat tomorrow : {}'.format(tomorrow) 
5

如果你不关心列表的排序之后,你可以洗牌的名单,然后再遍历它。

import random 
food = ['apple', 'banana', 'strawberry', 'blueberry', 'orange'] 
random.shuffle(food) 

for f in food: 
    print f 

如果你不需要所有这些,你应该只是弹出一个项目,当你想要它(这将耗尽列表)。

import random 
food = ['apple', 'banana', 'strawberry', 'blueberry', 'orange'] 
random.shuffle(food) 

try: 
    print food.pop() 
except IndexError: 
    print "No more food left!" 

# .... 
# some more code 
# I'm hungry! 

try: 
    print food.pop() 
except IndexError: 
    print "No more food left!" 

# etc. 

尝试...除了需要处理的情况下,你想从一个空的列表中获取食物。

1

我会使用random.sample

>>> from random import sample 
>>> food = ['apple', 'banana', 'strawberry', 'blueberry', 'orange'] 
>>> sample(food, 2) 
['banana', 'blueberry'] 
>>> sample(food, 2) 
['orange', 'apple'] 
>>> today, tomorrow = sample(food, 2) 
>>> today 
'banana' 
>>> tomorrow 
'blueberry' 
2

相反的choice,使用sample

today, tomorrow = random.sample(food, 2) 

从文档:

random.sample(population, k)

返回从​​序列中选择的唯一元素的长度列表。用于无需更换的随机抽样。

1

如果你不在意在销毁过程中的列表,你可以使用这个功能,而不是选择。

import random 

def del_choice(food): 
    if food: 
     return food.pop(random.randrange(len(food))) 
    return None 
+1

...或一次洗牌的列表,并弹出从中随机元素,直到列表为空。 – bgporter

+1

是的......但只有当你不是在pop调用之间以某种方式再次对列表进行排序的时候;]实际上,可能有太多的用例提供单一的解决所有答案 –