从Python列表中的列表创建总和?

时间:2012-11-09 02:37:59

标签: python python-3.x

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

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

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

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

6 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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)

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

答案 2 :(得分: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])

答案 3 :(得分:3)

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

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

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

numbersum = sum(numbers)

答案 4 :(得分: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

答案 5 :(得分:0)

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

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

所以map(None, *months)[1]是您寻找的列表。