1

我不太清楚如何问这个问题,而且我对编程的经验也不是很丰富,所以你必须原谅我。无论如何,我有一个问题。基本上,我需要得出一些数字的总和以及平均值。

该程序应该具有用户输入值。他们输入一个月和与该月相关的数字,然后我需要得到平均值。所以我有一个大列表,然后在该列表中列出。它基本上看起来像这样:

    months = [["January", 3.45], ["February", 7.1865], ["March", 4.56]]

我想知道的是,我如何挑选出每个列表中的第二个元素?我在想我可以使用 for 循环并将数字编译到一个单独的列表中,但我尝试了,但我无法正确计算。

4

6 回答 6

6

还没有人说这个:

sum(x[1] for x in monthlist)

正如下面评论中提到的,如果您知道 中的每个元素monthlist都是可迭代的并且恰好有 2 个元素,那么您可以通过解包元组来使这一点更加明确:

sum(value for month,value in monthlist)

这不会创建一个中间列表,只是为了传递给 sum。这就是发电机的美妙之处。如果monthlist 是某种惰性迭代器(例如文件对象),这里真正的优点是。然后你可以对它进行求和,而不是一次在内存中存储一​​个以上的元素:

#code to sum the first column from a file:
with open(file) as f:
    first_col_sum = sum(float(line.split()[0]) for line in f)
于 2012-11-09T02:49:20.057 回答
6

不妨将此作为答案而不是评论。该zip函数的工作方式有点像拉链,结合了匹配的元素:

>>> zip([1,2,3],[4,5,6])
<zip object at 0xb6e5beec>
>>> list(zip([1,2,3],[4,5,6]))
[(1, 4), (2, 5), (3, 6)]

并且使用 * 运算符,它基本上将 f(*[a,b]) 转换为 f(a,b),我们可以倒退:

>>> list(zip(*(zip([1,2,3],[4,5,6]))))
[(1, 2, 3), (4, 5, 6)]

所以我们可以zip用来分解你的列表:

>>> list(zip(*months))
[('January', 'February', 'March'), (3.45, 7.1865, 4.56)]
>>> monthnames, numbers = zip(*months)
>>> monthnames
('January', 'February', 'March')
>>> numbers
(3.45, 7.1865, 4.56)

如果您只关心其中一个,效率会稍低一些,但熟悉它是一个有用的习语。

于 2012-11-09T02:51:23.233 回答
5

列表推导可以在这里为您提供帮助:

names = [item[0] for item in months]
numbers = [item[1] for item in months]

如果您只使用普通for循环,事情会变得更加混乱:

names = []
numbers = []

for item in months:
    names.append(item[0])
    numbers.append(item[1])
于 2012-11-09T02:40:36.160 回答
3

要提取每个列表中的第二个元素:

numbers = [i[1] for i in months]

如果你想得到所有数字的总和:

numbersum = sum(numbers)
于 2012-11-09T02:40:34.767 回答
1

itemgetter的另一种选择:

from operator import itemgetter

months = [["January", 3.45], ["February", 7.1865], ["March", 4.56]]
sum(map(itemgetter(1), months)) # what means sum all items where each item is retrieved from month using index 1
于 2012-11-09T02:44:23.513 回答
0

添加是因为我还没有看到它。

>>> map(None,*months)
[('January', 'February', 'March'), (3.4500000000000002, 7.1864999999999997, 4.5599999999999996)]

map(None, *months)[1]您寻找的清单也是如此。

于 2012-11-09T03:21:04.653 回答