【问题标题】:Python output a string only once with random/choicePython随机/选择仅输出一次字符串
【发布时间】:2014-02-03 05:08:36
【问题描述】:

我正在尝试在 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)

【问题讨论】:

  • 尝试类似 - for foodItem in food: print foodItem

标签: python list random


【解决方案1】:

如果你不关心之后列表的顺序,你可以先打乱列表,然后迭代它。

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.

try ... except 用于处理您想从空列表中获取一些食物的情况。

【讨论】:

    【解决方案2】:
    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)
    

    【讨论】:

      【解决方案3】:

      sample代替choice

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

      来自文档:

      random.sample(population, k)

      返回从population 序列中选择的唯一元素的k 长度列表。用于无放回的随机抽样。

      【讨论】:

        【解决方案4】:

        我会使用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'
        

        【讨论】:

          【解决方案5】:

          如果你不在乎在过程中破坏你的列表,你可以使用这个函数来代替选择。

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

          【讨论】:

          • ...或将列表洗牌一次并从中弹出随机元素,直到列表为空。
          • 是的...但前提是您没有在 pop 调用之间以某种方式再次对列表进行排序;] 实际上,可能有太多用例无法提供一个单一的、解决所有问题的答案跨度>
          【解决方案6】:

          你可以试试这个技巧。 通过这种方式,您可以一次仅打印一次列表中的所有元素。 只需将您已经打印的那些附加到一个新列表中,对两个列表进行排序,然后匹配两个列表的列表元素或长度。 无论哪种方式,如果两个列表都按元素或纵向匹配,则跳出无限循环!

          from random import choice
          q = 0
          k = []
          food = ['apple', 'banana', 'strawberry', 'blueberry', 'orange']
          food.sort()
          while True:
            i = choice(food)
            if i in k:
              pass
            else:
              print('You should eat today :' + i)
              k.append(i)
              k.sort()
            q += 1
            if k == food:
              break
          

          【讨论】:

            猜你喜欢
            • 2014-04-03
            • 2013-10-28
            • 1970-01-01
            • 2020-04-07
            • 1970-01-01
            • 1970-01-01
            • 2019-05-25
            • 1970-01-01
            • 2015-09-19
            相关资源
            最近更新 更多