【问题标题】:Average of all values in a list - is there a more 'Pythonic' way to do this?列表中所有值的平均值 - 有没有更“Pythonic”的方法来做到这一点?
【发布时间】:2014-02-22 03:32:52
【问题描述】:

所以我正在遵循 Python 初学者指南,并得到了这个练习:

创建一个包含 0 到 1000 之间的 100 个随机整数的列表(使用 迭代、追加和随机模块)。写一个函数叫 average 将列表作为参数并返回平均值。

我在几分钟内轻松解决了它,但chapter 还提到了几种遍历列表并将多个值分配给列表和变量的方法,我不确定我是否完全理解,所以我不知道如果有可能在更少的行中做到这一点。这是我的答案:

import random

def createRandList():
    newlist = []
    for i in range(100):
        newint = random.randrange(0,1001)
        newlist.append(newint)
    return newlist

def average(aList):
    totalitems = 0
    totalvalue = 0
    for item in aList:
        intitem = int(item)
        totalitems = totalitems + 1
        totalvalue = totalvalue + intitem
    averagevalue = totalvalue/totalitems
    return averagevalue

myList = createRandList()
listAverage = average(myList)

print(myList)
print(listAverage)

提前致谢!

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    使用 Python 的内置 sumlen 函数:

    print(sum(myList)/len(myList))
    

    【讨论】:

    • 而createRandList可以表示为[random.randrange(0, 1001) for i in range(100)]
    • 非常感谢!很高兴发现 sum 在列表中工作。
    • 另外,Python 变量通常是 lower_case_with_underscores 而不是混合大小写。 my_list 而不是 myList。
    • 很高兴知道,我一直在遵循指南中使用的约定,但我以后肯定会这样做。
    【解决方案2】:

    我同意上面关于使用sum 的建议。

    虽然我不喜欢使用列表推导来运行固定数量的迭代,但您的 createRandList 函数体可能很简单:

    return [random.randint(0,1000) for i in range(100)]
    

    (另外,我发现randint 更具可读性,因为“停止”值是您想要的,而不是您想要的 + 1。)

    在任何情况下,您都可以省去在号码上调用int() 的那一行——randrange 的输出已经是 int。

    【讨论】:

    • 虽然randint 诉诸更普遍的常识,randrange 是首选,因为它与 Python 约定一致,例如range(start, stop) 和切片语法 ([start, stop])。事实上,randint 在 python 历史上已经多次被弃用。见stackoverflow.com/a/2568917/2980246
    猜你喜欢
    • 2010-12-08
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    相关资源
    最近更新 更多