元组列表和平均计算[重复]

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 检查。使用更新后的代码重试。

以上是关于元组列表和平均计算[重复]的主要内容,如果未能解决你的问题,请参考以下文章

计算元组列表中数值的平均值

在 Python 中使用 for 循环计算元组列表的平均值

计算第一个数字相似的所有元组值的平均值

Python基础(3) - 去掉列表或元组中的重复元素

基于键名的元组平均列表?

Python:元组和列表之间的差异和相似之处[重复]