【问题标题】:Generating random values in python在python中生成随机值
【发布时间】:2013-10-29 11:30:28
【问题描述】:

我需要生成 100 个介于 0 和 500 之间的随机值,并将偶数存储在一个列表中,将奇数存储在另一个列表中。我一开始就卡住了。

import random

def randomval():

   size=random.randint(0, 500)
   return 
   if val%2==0:
       listeven.append()
   else:
       listodd.append()

【问题讨论】:

  • 您尝试过测试一个值是奇数还是偶数?还是因为 randomval() 函数没有返回您期望得到的结果而被卡住了?
  • 你必须return size。然后调用 randomval() 函数 100 次。那么你就完成了。
  • (对不起,我很懒,只是发布了一个解决方案;在这个看起来像家庭作业的问题上,可能只是暗示要做什么会更好。)
  • 这已经好多了,return 现在挡住了,您似乎忘记了包含一个循环,但现在更多的是尝试自己编写代码。

标签: python list random python-3.x


【解决方案1】:
both = [ random.randint(0, 500) for i in range(100) ]
odd = [ x for x in both if x % 2 == 1 ]
even = [ x for x in both if x % 2 == 0 ]

【讨论】:

  • 请修正 if 语句
  • x & 1 通常稍微快一些,尽管不太明显。
  • 是的,我混合了 & 1% 2 不成功;-)
【解决方案2】:

解决方法取决于随机数是否可以重复。

random_values = [ random.randint(0, 500) for i in range(100) ]
odd = [ x for x in random_values if x % 2 ]
even = [ x for x in random_values if not x % 2 ]

如果您想获得唯一的随机数,我建议您使用随机播放

random_values = random.sample(range(0, 500), 100)
odd = [ x for x in random_values if x % 2 ]
even = [ x for x in random_values if not x % 2 ]

例如,您可以使用生成器来减少内存使用量

random_values = (random.randint(0, 500) for i in xrange(100))
odd = []
even = []
for val in random_values:
    if val % 2:
        odd.append(val)
    else:
        even.append(val)

【讨论】:

    【解决方案3】:

    一次性完成所有操作 - 效率更高。

    from random import randint
    
    even, odd = [], []
    for _ in range(100):
        num = randint(0, 500)
        if num % 2:
            odd.append(num)
        else:
            even.append(num)
    

    作为一个函数:

    def get_random_even_and_odd(amount=100, _min=0, _max=500):
        even, odd = [], []
        for _ in range(amount):
            num = randint(_min, _max)
            if num % 2:
                odd.append(num)
            else:
                even.append(num)
        return even, odd
    

    【讨论】:

    • Ick,当你真的应该使用 if 语句时,不要使用条件表达式。只需使用if num % 2: odd.append(num)else: even.append(num)。如果您必须使用单行,odd if num % 2 else even).append(num) 可能更丑陋,但至少您将条件表达式用作其自身的实际表达式。
    • 一般来说是对的,@MartijnPieters,但如果使用 if 语句意味着大量加倍代码,我认为需要权衡取舍。在这种情况下,它只是 .append(num) 加倍,所以没关系,但如果那部分更大,那么我更喜欢你提出的条件表达式。
    • @Alfe:不要将单行代码与可读性混淆。使用条件表达式会产生某些期望,即整个表达式的结果将用于某事。相反,Inbar 只是将它用于副作用(更改了两个可变变量之一)。
    • 当然,Inbar 方式(可以这么说)是一种滥用。我只将语句(四行,加倍代码)与条件语句(你建议的一行)进行了比较。而且,顺便说一句,条件句可以分布在多行以增加可读性。之前做过很多函数式编程,已经习惯了。但当然,代码加倍或比可读性更客观的方面。
    猜你喜欢
    • 1970-01-01
    • 2013-11-13
    • 2010-10-15
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    • 2020-02-16
    • 2015-07-08
    相关资源
    最近更新 更多