【问题标题】:Python sum of every third list每三个列表的Python总和
【发布时间】:2019-12-04 21:43:32
【问题描述】:

我有以下问题。

我需要读取 x 个文本文件并获取每三个列表的总和。一个例子是:

文件 1

[1.0, 2.0, 3.0]
[3.1, 2.1, 2.1]
[3.4, 3.4, 4.4]

文件 2

[1.0, 2.0, 3.0]
[3.1, 2.1, 2.1]
[3.4, 3.4, 4.4]

结果:

[2.0, 4.0, 6.0]
[6.2, 4.2, 4.2]
[6.8, 6.8, 8.8]

问题是如何将匹配列表求和?

我知道我可以使用 zip 来获取列表的总和,然后打开文件,逐行读取并存储到列表中,但我不确定如何定位正确的总和?

如果只有 2 种情况,我可以用 if 条件检查计数器是偶数还是奇数,但是当有 3 种情况时如何处理呢? Python 有内置的解决方案吗?该解决方案还必须可扩展到包含 3 个列表的 x 数量的文件。这也意味着我不能只列出案例。

【问题讨论】:

  • 有什么东西禁止你列出清单吗?这样您打开的每个文件都会输出 1 个包含 3 个列表的列表。这样,您可以简单地使用 len() 来放大和缩小 n 个列表。并且可以简单地使用 for 循环迭代器对它们进行求和
  • 是的,没有什么能阻止我这样做,但我如何总结例如第 4 和第 7、第 2、第 5 和第 8、第 3 和第 4 和第 9。这是我在这里遇到的主要问题,我无法找到解决方案
  • 那么你有两个嵌套列表的 len 。这是一个索引和一个计数器。然后,您只需根据需要生成您的配对。要将列表分离到相应的列表以求和,我会考虑使用模函数。

标签: python list if-statement


【解决方案1】:
result = list()
for l_index, num_list in enumerate(file1):
    result_list = list()
        for e_index, element in enumerate(num_list):
            result_list.append(file1[l_index][e_index] + file2[l_index][e_index])
result.append(result_list)

我只是假设每个文件都保存在一个嵌套列表中,如果不是这样,我真的不知道你应该怎么做。

我不确定 1. 我写的代码是否正确(但你应该明白我在做什么)和 2. 如果我理解正确你想要做什么。

编辑:调整了代码,所以现在它应该做的事情

【讨论】:

  • 不,那不是真的。如果我正确理解了您的代码,那么您将在此处合并列表。我需要从文件中读取的每第三个列表与相应的列表相加,例如第一个与第 4 和第 7、第 2 与第 5 和第 8、第 3 与第 4 和第 9 基本上我需要以包含总和的 3 个列表结束匹配的
  • @Chakson 我很困惑,很确定很遗憾我帮不了你,但为了澄清我的代码做了什么:假设每个文件都是一个嵌套列表(列表列表),它需要:第一个文件中第一个列表中的第一个值并将此数字添加到:第二个文件中第一个列表中的第一个值等等,这应该看起来像这样:file1 [[1.0, 2.0, 3.0], [1.1, 2.1, 3.1], [1.4, 2.4, 3.4]] 文件2 [[4.0, 5.0, 6.0], [4.1, 5.1, 6.1], [4.4, 5.4, 6.4]] 结果:[[5.0, 7.0, 9.0]、[5.2、7.2、9.2]、[5.8、7.8、9.8]]
  • 嗯,是的,基本上它符合预期。我会接受答案,即使它不符合我的需求,因为它是一个解决方案。问题是我正在使用 os.listdir(path) 查看整个目录,因此我无法在一次运行中真正区分 file1、file2 等。我最终制作了一个大列表并使用 list[0::9] 来获取匹配的元素等等。
  • Chakson 看看我的解决方案。我认为这更符合您的要求
  • 也可行,非常感谢!我最终做了我在那里写的,因为它适用于我的用例
【解决方案2】:

这行得通吗?

给定一个嵌套列表,如您的案例问题:

file1 = [[1.0,2.0,3.0],[3.1,2.1,2.1],[3.4,3.4,4.4]]
file2 = [[1.0,2.0,3.0],[3.1,2.1,2.1],[3.4,3.4,4.4]] 

只需在 n 个文件之后连接嵌套列表。 (订单仍然存在,所以我们很好)

comb = file1+file2

在函数中执行您的操作,使其“模块化”

def operate(data,n):#heres the function
    if n == 2: #naive way to initialize your output
        summary = [[],[]]
    elif n == 3:
        summary = [[],[],[]]
    for index,dat in enumerate(data): #getting index +the list
        f = [] #holder for the temp data. habit of overwriting stuff
        if index%n == 1: #modulo function lets you do for every n list. 
                         #Good experiment to extend this dynamically for n cases instead of just up to 3
            if len(summary[1]) == 0:
                summary[1] = dat
            else:
                for a,b in zip(summary[1],dat): #your zip 
                    f.append(a+b)
                summary[1] = f #since its a sum we just do it for each pair and replace 


        elif index%n == 2: 
            if len(summary[2])== 0:
                summary[2] = dat
            else:
                for a,b in zip(summary[2],dat):
                    f.append(a+b)
                summary[2] = f
        elif index%n == 0:
            if len(summary[0])== 0:
                summary[0] = dat
            else:
                for a,b in zip(summary[0],dat):
                    f.append(a+b)
                summary[0] = f



    return summary
file1 = [[1.0,2.0,3.0],[3.1,2.1,2.1],[3.4,3.4,4.4]]
file2 = [[1.0,2.0,3.0],[3.1,2.1,2.1],[3.4,3.4,4.4]] 

comb = file1+file2
t2 = operate(comb,2)
t3 = operate(comb,3)

print("for every second list sum: ",t2)
print("for every third list sum: ",t3)

理论上,您可以通过动态编程案例将其扩展到任何集合,但我认为您了解它的要点。

输出:

for every second list sum:  [[7.5, 7.5, 9.5], [7.5, 7.5, 9.5]]
for every third list sum:  [[2.0, 4.0, 6.0], [6.2, 4.2, 4.2], [6.8, 6.8, 8.8]]

请尝试更好地初始化汇总变量。它将成为您将案例扩展到订单 >3

的解决方案的一部分

【讨论】:

    猜你喜欢
    • 2022-11-12
    • 2017-08-20
    • 2016-11-30
    • 2020-10-02
    • 2022-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多