gpt4 book ai didi

Python:根据前 2 个内部列表值删除列表重复项

转载 作者:行者123 更新时间:2023-12-03 20:01:03 25 4
gpt4 key购买 nike

问题:

我有以下格式的列表:

x = [["hello",0,5], ["hi",0,6], ["hello",0,8], ["hello",1,1]]

算法:

  • 合并所有具有相同起始值的内部列表,第三个值不必相同即可合并它们
    • 例如"hello",0,5 "hello",0,8
    • 结合
    • "hello",1,1
    • 结合
  • 第三个值成为第三个值的平均值:sum(all 3rd vals)/len(all 3rd vals)
    • 注意:all 3rd vals 我指的是每个内部重复项列表的第 3 个值
    • 例如"hello",0,5"hello",0,8 变成 hello,0,6.5

期望的输出:(列表的顺序无关紧要)

x = [["hello",0,6.5], ["hi",0,6], ["hello",1,1]]

问题:

  • 如何在 Python 中实现该算法?

理想情况下它会很有效,因为这将用于非常大的列表。

如果有任何不清楚的地方,请告诉我,我会解释。

编辑:我试图将列表更改为一个集合以删除重复项,但这并没有考虑到内部列表中的第三个变量,因此不起作用。

解决方案性能:

Thanks to everyone who has provided a solution to this problem! Hereare the results based on a speed test of all the functions:

Performance Data

最佳答案

使用运行总和和计数更新

我想出了如何改进我以前的代码(见下面的原文)。您可以继续运行总计和计数,然后在最后计算平均值,这样可以避免记录所有单独的数字。

from collections import defaultdict

class RunningAverage:
def __init__(self):
self.total = 0
self.count = 0

def add(self, value):
self.total += value
self.count += 1

def calculate(self):
return self.total / self.count

def func(lst):
thirds = defaultdict(RunningAverage)
for sub in lst:
k = tuple(sub[:2])
thirds[k].add(sub[2])
lst_out = [[*k, v.calculate()] for k, v in thirds.items()]
return lst_out

print(func(x)) # -> [['hello', 0, 6.5], ['hi', 0, 6.0], ['hello', 1, 1.0]]

原始答案

这可能不会很有效,因为它必须累加所有值才能对它们进行平均。我认为您可以通过考虑权重因素的运行平均值来解决这个问题,但我不太确定该怎么做。

from collections import defaultdict

def avg(nums):
return sum(nums) / len(nums)

def func(lst):
thirds = defaultdict(list)
for sub in lst:
k = tuple(sub[:2])
thirds[k].append(sub[2])
lst_out = [[*k, avg(v)] for k, v in thirds.items()]
return lst_out

print(func(x)) # -> [['hello', 0, 6.5], ['hi', 0, 6.0], ['hello', 1, 1.0]]

关于Python:根据前 2 个内部列表值删除列表重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59229398/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com