平均两个列表

时间:2018-11-25 15:48:32

标签: python list average

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

 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]]

我当时在考虑使用嵌套循环,但似乎操作过多。 (由于这些列表仅是示例,因此我使用的列表很长。) thx的帮助!

4 个答案:

答案 0 :(得分:0)

我们可以使用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]]

答案 1 :(得分:0)

如果要一行完成,可以执行以下操作:

>>> [ [ 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]]

答案 2 :(得分:0)

您可以使用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 :(得分:0)

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

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