元组列表和平均计算[重复]
Posted
技术标签:
【中文标题】元组列表和平均计算[重复]【英文标题】:List of tuples and mean calculation [duplicate] 【发布时间】:2021-06-03 03:27:20 【问题描述】:我有以下元组列表:
list = [(120, 'x'), (1120, 'y'), (1330, 'x'), (0, 't'), (1, 'x'), (0, 'd'), (2435, 'x')]
我想计算所有元组的第一个分量的平均值。我做了以下事情:
s = []
for i in range(len(list)):
a = list[0][i]
if a =! 0:
s.append(a)
else:
pass
mean = sum(s) / len(s)
它有效,但我的问题是是否有任何方法可以避免使用 for 循环?因为我有一个非常大的元组列表,并且由于时间计算,如果可能的话,我需要找到另一种方法。
根据上面所说的for循环方法。我怎么能找到关于wights的平均值?我的意思是,例如列表中的最后一个元素是(2435, 'x')
,与(1, 'x')
中的1
相比,数字2435
非常大。任何想法将不胜感激。提前致谢。
【问题讨论】:
如果这真的是 Python 2,不使用range
会有所帮助。我认为您不会比这更快地做事(缺少编写可以从 Python 调用的 C 函数)。您将需要从元组中提取数字,因此某种循环(甚至是隐藏在推导式中的循环)是不可避免的。
无需道歉。您问题的最后一段表明您的问题不仅仅是计算平均值。如果是这样,我在下面的回答可能值得将您的数据转换为 pandas 数据框的成本。 Pandas 可以轻松实现,例如计算一些观察值的平均值(例如,在某一列中带有'x'
的观察值)。
【参考方案1】:
循环是不可避免的,因为您需要按照 John 的描述至少遍历所有元素一次。
但是,您可以使用基于迭代器的方法来摆脱创建列表以节省空间:
mean = sum(elt[0] for elt in lst)/len(lst)
更新:我意识到您只需要非零元素的平均值。您可以修改方法以不在列表中存储元素。
total = 0
counts = 0
for elt in lst:
if elt[0]:
total += elt[0]
counts += 1
mean = total/counts
【讨论】:
mean0 = sum(map(lambda x: x[0], lst)) / len(lst)
- 另一种在代码中没有显式循环但内部存在循环的方法。
非常感谢您的回答。它有效,但它需要零。所以我想在这里摆脱零,有什么想法吗?列表的完整长度是 7,我有 2 个零组件,所以新长度是 5
另外,不要使用基于 range()
的循环,而是使用基于值的循环来直接迭代值,并且您不需要 else
。【参考方案2】:
熊猫方法:
import pandas as pd
tuples = [(120, 'x'), (1120, 'y'), (1330, 'x'), (0, 't'), (1, 'x'), (0, 'd'), (2435, 'x')]
df = pd.DataFrame(tuples)
df[0][df[0]!=0].mean() #1001.2
需要仔细把握时机,看看这是否比您目前正在做的更好。实际的平均计算应该更快,但收益很可能会被转换成本所抵消。
【讨论】:
【参考方案3】:您确实需要一个 for 循环,但您可以使用 list comprehension 使其更简洁。
此外,python 标准库有一个非常好的statistics module,您可以使用它来计算平均值。
另外请注意,请不要使用list
作为变量名,它可能与list
类型混淆。
from statistics import mean
mylist = [(120, 'x'), (1120, 'y'), (1330, 'x'), (0, 't'), (1, 'x'), (0,'d'), (2435, 'x')]
m = mean([item[0] for item in mylist if item[0] != 0])
print(m)
1001.2
在 Python 2.7 中
items = [item[0] for item in mylist if item[0] != 0]
mean = sum(items)/len(items)
print(mean)
1001.2
最后通过重构列表推导来显示更有意义的变量名称,例如items = [number for number, letter in mylist if number != 0]
【讨论】:
@alec_djinn,谢谢你的回答。它有效,但它需要 in 的零。所以我想在这里摆脱零,有什么想法吗? @Amir 我已更新列表理解以包含number != 0
检查。使用更新后的代码重试。以上是关于元组列表和平均计算[重复]的主要内容,如果未能解决你的问题,请参考以下文章