我有两个列表列表,我想创建一个新的列表列表,其中包含每个列表平均值(取每个位置的平均值)。 例如:如果我有以下列表:
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的帮助!
答案 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