【问题标题】:Averaging two list of lists平均两个列表列表
【发布时间】:2018-11-25 15:48:32
【问题描述】:

我有两个列表列表,我想创建一个新列表列表,其中包含每个列表的平均值(平均每个位置的值)。 例如:如果我有以下列表:

 file1 = [[1, -1], [2, -2], [3, -3], [4, -4]]
 file2 = [[20, -40], [2, 0], [-50, 7], [30150, -200]]

平均列表结果将是:(使用 int 进行舍入)

avg = [[10, -20], [2, -1], [-23, 2], [15077, -102]]

一旦我这样做了,如果列表的长度不同,我必须按原样添加长列表的组件。例如:

file1 = [[1, -1], [2, -2], [3, -3], [4, -4],[100, 100]
 file2 = [[20, -40], [2, 0], [-50, 7], [30150, -200]]

结果将是:

[[10, -20], [2, -1], [-23, 2], [15077, -102],[100, 100]]

我正在考虑使用嵌套循环,但它似乎操作太多。 (因为这些列表只是示例,而我使用的是一个很长的列表......) 谢谢你的帮助!

【问题讨论】:

  • 我不明白你的数字。你的平均水平是多少?
  • 所有相同位置的数字。 1 和 20、-1 和 40 等等@cha0site
  • 它们在我能想到的任何方面都不是平均的
  • 那么为什么 -1 和 -40 的平均值为 10?
  • 哦,对不起!我添加了错误的列表。修复它..谢谢@roganjosh

标签: python list average


【解决方案1】:

我们可以使用zip() 来合并我们的文件,然后将我们的元组值的平均值附加到avg

file1 = [[1, -1], [2, -2], [3, -3], [4, -4],[100, 100]]
file2 = [[20, -40], [2, 0], [-50, 7], [30150, -200]]
avg = []

for x1, x2 in zip(file1, file2):
    avg.append([(x1[0] + x2[0])//2, (x1[1] + x2[1])//2])

if len(avg) < len(file1):
    avg.extend(file1[len(avg):])
elif len(avg) < len(file2):
    avg.extend(file2[len(avg):])

print(avg) # -> [[10, -21], [2, -1], [-24, 2], [15077, -102], [100, 100]]

【讨论】:

    【解决方案2】:

    你可以使用zip_longest:

    from itertools import zip_longest
    
    lst1 = [[1, -1], [2, -2], [3, -3], [4, -4], [100, 100]]
    lst2 = [[20, -40], [2, 0], [-50, 7], [30150, -200]]
    
    
    def avg(numbers):
        not_none = [n for n in numbers if n is not None]
        return sum(not_none) // len(not_none)
    
    
    result = [[avg(e) for e in zip_longest(il, jl)] for il, jl in zip_longest(lst1, lst2, fillvalue=[])]
    
    print(result)
    

    输出

    [[10, -21], [2, -1], [-24, 2], [15077, -102], [100, 100]]
    

    【讨论】:

      【解决方案3】:

      如果你想在一行中完成,你可以这样做:

      >>> [ [ int(sum(l2)/len(l2)) for l2 in zip(*l)] for l in zip(file1, file2) ]
      [[10, -20], [2, -1], [-23, 2], [15077, -102]]
      

      我们也可以用zip_longest 做丑事:

      >>> [ [ int(sum([x for x in l2 if x is not None])/len([x for x in l2 if x is not None])) for l2 in zip_longest(*l)] for l in zip_longest(file1, file2, fillvalue=[]) ]
      [[10, -20], [2, -1], [-23, 2], [15077, -102], [100, 100]]
      

      【讨论】:

        【解决方案4】:

        我认为这是一个很好的解决方案:

        def averageList(list1, list2):
            avg = []
            n = 0
            while n < max(len(list1), len(list2)):
                if n < min(len(list1), len(list2)):
                    avg.append([int((list1[n][0]+list2[n][0])/2), int((list1[n][1]+list2[n][1])/2)])
                elif len(list1) > len(list2):
                    avg.append(list1[n])
                elif len(list1) < len(list2):
                    avg.append(list2[n])
                n = n+1
            return avg
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-09-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-14
          • 2018-06-30
          • 2023-03-10
          相关资源
          最近更新 更多