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

在Python中从列表中的列表创建总和?,python,python-3.x,Python,Python 3.x,我不太确定该怎么问这个问题,而且我对编程也不是很有经验,所以你必须原谅我。无论如何,我有个问题。基本上,我需要算出一些数字的和,还有平均数 程序应该具有用户输入值。他们输入一个月和一个与该月相关的数字,然后我需要得到平均值。所以我有一个大的列表,然后是列表中的列表。基本上是这样的: months = [["January", 3.45], ["February", 7.1865], ["March", 4.56]] 我想知道的是,如何在每个列表中挑出第二个元素? 我想我可以使用for循

我不太确定该怎么问这个问题,而且我对编程也不是很有经验,所以你必须原谅我。无论如何,我有个问题。基本上,我需要算出一些数字的和,还有平均数

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

    months = [["January", 3.45], ["February", 7.1865], ["March", 4.56]]
我想知道的是,如何在每个列表中挑出第二个元素?
我想我可以使用for循环并将数字编译成一个单独的列表,但我尝试了,但无法正确计算。

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

numbers = [i[1] for i in months]
如果要获得所有数字的总和:

numbersum = sum(numbers)

要提取每个列表中的第二个元素,请执行以下操作:

numbers = [i[1] for i in months]
如果要获得所有数字的总和:

numbersum = sum(numbers)

列表理解可以帮助您:

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])

列表理解可以帮助您:

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])
另一个选项是:

另一个选项是:


还没有人说过这句话:

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)

还没有人说过这句话:

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)

也许这只是一个回答,而不是评论。拉链功能的工作原理类似于拉链,结合了匹配的元素:

>>> 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)]
因此,我们可以使用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)

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

不妨将此作为回答而不是评论。拉链功能的工作原理类似于拉链,结合了匹配的元素:

>>> 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)]
因此,我们可以使用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)

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

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

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

所以mapNone,*months[1]是您要查找的列表。

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

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

因此,mapNone,*months[1]是您要寻找的列表。

聪明。我没有想到这个是zip。我可能想评论一下,在py2k上,zip*months返回一个列表,而在py3k上,它是一个迭代器zip对象。聪明。我本不会想到zip。可能想评论一下,在py2k上,zip*months返回一个列表,而在py3k上,它是一个迭代器zip对象。我也喜欢命名的版本:sumnum表示名称,num表示月份列表,尽管它对结构进行了硬编码,而不是x[1]。@DSM-也添加了该版本,谢谢。通常在这种情况下,我会使用sumnum作为num,monthlist中的num,但现在我开始重新思考这个问题。毕竟,为什么不提醒自己monthlist实际上存储了什么?我也喜欢命名的版本:sumnum代表名称,num in monthlist,尽管它比x[1]更硬编码结构。@DSM-也添加了该版本,谢谢。通常在这种情况下,我会使用sumnum作为num,monthlist中的num,但现在我开始重新思考这个问题。毕竟,为什么不提醒自己monthlist实际上存储了什么呢?这是因为mapNone,*x和zip*x是一样的。我认为这在Python3中不起作用。listmapNone,*months给出TypeError:“非类型”对象不可调用;我认为他们删除了None快捷方式。这是因为mapNone,*x与zip*x相同。我认为这在Python 3中实际上不起作用。listmapNone,*months给出TypeError:“非类型”对象不可调用;我想他们取消了捷径。