【问题标题】: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' 的观察值)。

标签: python python-3.x list


【解决方案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 检查。使用更新后的代码重试。
    猜你喜欢
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 2021-03-18
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2014-04-20
    相关资源
    最近更新 更多