我不太确定如何问这个问题,而且我不是所有有编程经验的人,所以你必须原谅我。无论如何,我有一个问题。基本上,我需要得出一些数字的总和以及平均值。
程序应该具有用户输入值。他们输入一个月和一个与该月相关的数字,然后我需要得到平均值。所以我有一个大的列表,然后在该列表中列出。它基本上是这样的:
months = [["January", 3.45], ["February", 7.1865], ["March", 4.56]]
我想知道的是,我如何挑出每个列表中的第二个元素? 我以为我可以使用for循环并将数字编译成一个单独的列表,但我尝试了,我无法正确计算。
答案 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]
是您寻找的列表。