2017-02-12 6 views
3

Ich versuche, eine Liste zu erhalten, die den Mittelwert aller (i) te Element in allen Listen eines list.To mehr erklären ist, wenn ich die nächste Liste:Mittelwert der Liste der unaqual Listen

A=[[1,2], [2,3], [1,2,3], [3,4,5], [2,2,1]]. 

ich möchte [a,b,c] mit haben:

a = (1+2+1+3+2)/5 
b = (2+3+2+4+2)/5 
c = (3+5+1)/3 

Jede Hilfe bitte!

+1

komisch, wie alle vorgeschlagenen Lösungen die gleiche XD – Copperfield

Antwort

1

Sie können mit itertools.izip_longest() wie so versuchen, wenn Sie auf Python2 sind:

from itertools import izip_longest 
from __future__ import division 

A=[[1,2], [2,3], [1,2,3], [3,4,5], [2,2,1]] 
a,b,c = [sum(filter(None, c))/len(filter(None,c)) for c in izip_longest(*A)] 

print a 
print b 
print c 

Ausgang:

1.8 
2.6 
3.0 
1

Verwenden itertools.zip_longest die Teil-Listen zu generieren, und statistics.mean den Mittelwert für jede Gruppe zu berechnen, außer der None s:

from itertools import zip_longest 
from statistics import mean 

averages = list(map(lambda l: mean(i for i in l if i != None), zip_longest(*A))) 

Mit Ihrem Beispiel:

>>> A = [[1, 2], [2, 3], [1, 2, 3], [3, 4, 5], [2, 2, 1]] 
>>> from itertools import zip_longest 
>>> from statistics import mean 
>>> list(map(lambda l: mean(i for i in l if i != None), zip_longest(*A))) 
[1.8, 2.6, 3] 
+0

sind Sie auch eine Liste Verständnis statt einer Liste-map-Lambda verwenden können: '[Mittelwert (i für i in L, wenn i = None) für L in zip_longest (* A)] 'und ist kurzgeschlossen – Copperfield

+0

Statistics ist veraltet, geändert in scipy.stats –

+0

Ich habe diesen Fehler TypeError: Objekt des Typs 'Generator' hat keine len() –

2

Verwendung itertools.zip_longest zu zip zusammen Werten. Die zusätzliche Schwierigkeit besteht darin, dass die Länge der Daten variiert. zip_longest fügt None als Füllwert ein. Wir haben eine gefilterte Liste zu erstellen, und zählen nur die Elemente:

import itertools 

A=[[1,2], [2,3], [1,2,3], [3,4,5], [2,2,1]] 

tuples = itertools.zip_longest(*A) 
for t in tuples: 
    s = [x for x in t if x is not None] 
    print(sum(s)/len(s)) 

Ergebnis:

1.8 
2.6 
3.0 

EDIT: Einzeiler (vielleicht ein wenig komplexer, lambda mit Mittelwert berechnen):

result = [(lambda x : sum(x)/len(x))([x for x in t if x is not None]) for t in itertools.zip_longest(*A)] 

Ergebnis: [1.8, 2.6, 3.0]

(Python 2 Benutzer müssen ersetzen zip_longest durch izip_longest)

+0

benutze Danke! Es funktioniert sehr gut .. :) –

+0

PS: zip_longest nicht mehr unterstützt, geändert zu izip_longest –

+0

@ E.Em: eigentlich ist es das Gegenteil. Sie verwenden Python 2. Sie können die Antwort akzeptieren, wenn es BTW funktioniert. –