Wydaje się to proste, ale nie mogę tego zrozumieć. Mam dziesięć kategorii i wyników przypisanych do każdego z nich. W etapie pośrednim przechowuję wyniki jako ["wynik", powtórzenia] Pary, jak w:

[20,3]
[40,7]
[50,2]

...

W końcu chcę rozwinąć te pary w powtórzenia liczb, a następnie scal i średnia, aby uzyskać taki wynik:

[20,20,20]
[40,40,40,40,40,40,40]
[50,50]

Połączone:

[20,20,20,40,40,40,40,40,40,40,50,50]

sum([20,20,20,40,40,40,40,40,40,40,50,50],0.0)/12

Wynik końcowy (średnia): 37

Jak więc osiągnąć krok # 2, gdzie rozszerzam wyniki x razy dla każdej parzenia? Mogę to zrobić, jeśli byli one ciągami, ale musi być numeryczny sposób na to zrobić.

2
ChewyChunks 12 październik 2011, 01:58

3 odpowiedzi

Najlepsza odpowiedź

Możesz to zrobić:

>>> a = [20,3]
>>> [a[0]] * a[1]
[20, 20, 20]

Jednak ten krok nie jest naprawdę konieczny. Aby uzyskać średnia ważona, możesz pomnożyć wartości przez ciężary, sumować je, a następnie podzielić przez sumę wag, takich jak:

float(20*3 + 40*7 + 50*2) / (3 + 7 + 2)

Konwersja na pływak jest wykonywana, aby uniknąć podziału całkowitego w Pythonie 2.

Może być taki napisany:

>>> xs = [[20,3], [40,7], [50,2]]
>>> float(sum(x[0] * x[1] for x in xs)) / sum(x[1] for x in xs)
36.666666666666664
8
interjay 11 październik 2011, 22:06

Jeśli chcesz rozszerzyć listy, jest tak proste jak:

x = [20, 3] # for example
# a list consisting of x[1] copies, of a list that contains only x[0]:
expanded = [x[0]] * x[1]

Jednak w przypadku opisanego problemu nie chcesz ani nie trzeba robić tego . To, co naprawdę robisz, obliczanie średnia ważona, gdzie drugie wartości są twoimi ciężarami.

Aby to zrobić, możemy po prostu pomnożyć pary razem, dodać te wyniki, a następnie dzielą się przez sumę ciężarów:

values = [[20, 3], [40, 7], [50, 2]]
total = sum(x[0] * x[1] for x in values)
weight = sum(x[1] for x in values)
average = float(total) / weight
# Or, more directly:
average = float(sum(x[0] * x[1] for x in values)) / sum(x[1] for x in values)
3
Karl Knechtel 11 październik 2011, 22:05

Czy musisz utworzyć rozszerzoną listę, jeśli próbujesz uzyskać średnią?

Zamiast tego sugeruję, że zamiast tego zrobiłeś średnia ważona.

count = sum(k[1] for k in scores)  # this is the count of items
total = sum(k[0] * k[1] for k in scores)   # this is the sum of scores
out = total / count
1
Donald Miner 11 październik 2011, 22:15