Verteilung berechnen funktioniert nicht

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
davinadavina
User
Beiträge: 4
Registriert: Sonntag 2. Juli 2017, 11:58

Hallo zusammen
Ich schreibe ein Programm zur Berechnung einer Verteilung.
Bei dem Teil von Liste4 funktioniert etwas nicht, es werden die falschen Zahlen berechnet. Kann mir jemand weiterhelfen? ist ziemlich wichtig. Danke im voraus!

Code: Alles auswählen

N = {1,2,3,4,5,6}
n = len(N)

Liste1=[]
for item in powerset(N):
    Liste1.append(Summe(item))

Liste1 = sorted(Liste1)
unique_values = list(set(Liste1))

Liste2 = []
for values in unique_values:
     Liste2.append(Liste1.count(values))

Liste3 = []
for i in range(0, len(Liste2), 1):
    Liste3.append((unique_values[i], Liste2[i]))

Liste4 = []
W = 2**n
for i in Liste2:
    Liste4.append((Liste1[i])/W)



Liste1
[0, 1, 2, 3, 4, 5, 6, 3, 4, 5, 6, 7, 5, 6, 7, 8, 7, 8, 9, 9, 10, 11, 6, 7, 8, 9, 8, 9, 10, 10, 11, 12, 9, 10, 11, 11, 12, 13, 12, 13, 14, 15, 10, 11, 12, 12, 13, 14, 13, 14, 15, 16, 14, 15, 16, 17, 18, 15, 16, 17, 18, 19, 20, 21]
unique_values
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21]
Liste2
[1, 1, 1, 2, 2, 3, 4, 4, 4, 5, 5, 5, 5, 4, 4, 4, 3, 2, 2, 1, 1, 1]
Liste3
[(0, 1), (1, 1), (2, 1), (3, 2), (4, 2), (5, 3), (6, 4), (7, 4), (8, 4), (9, 5), (10, 5), (11, 5), (12, 5), (13, 4), (14, 4), (15, 4), (16, 3), (17, 2), (18, 2), (19, 1), (20, 1), (21, 1)]
Liste4
[0.015625, 0.015625, 0.015625, 0.03125, 0.03125, 0.046875, 0.046875, 0.046875, 0.046875, 0.0625, 0.0625, 0.0625, 0.0625, 0.046875, 0.046875, 0.046875, 0.046875, 0.03125, 0.03125, 0.015625, 0.015625, 0.015625]
Zuletzt geändert von Anonymous am Sonntag 2. Juli 2017, 12:14, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@davinadavina: Was sind denn `powerset()` und `Summe()`? Und was wären denn die richtigen Ergebnisse?
davinadavina
User
Beiträge: 4
Registriert: Sonntag 2. Juli 2017, 11:58

Code: Alles auswählen

def powerset(iterable):
    """powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3).
    Zurückgegeben wird ein sogenannter Konstruktor."""
    s = list(iterable)
    return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))

def Summe(N):
    """N ist ein iterierbares Objekt."""
    zwischen_total=0
    for e in N:
        zwischen_total+=e
    return zwischen_total
das sind powerset und summe.
die richtigen Verteilungen wären
0.015625, 0.015625, 0.015625, 0.03125, 0.03125, 0.046875, 0.0625, 0.0625, 0.0625, 0.078125, 0.078125, 0.078125, 0.0625, 0.0625, 0.0625, 0.046875, 0.03125, 0.03125, 0.015625, 0.015625, 0.015625
Zuletzt geändert von Anonymous am Sonntag 2. Juli 2017, 12:53, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@davinadavina: `Summe()` scheint mir überflüssig zu sein, das macht ja das gleiche wie die `sum()`-Funktion.

Benenne vielleicht mal die ganze `Liste*`\n um und auch die Laufvariablen in den Schleifen, so das die Namen verraten was die Werte bedeuten. Ich finde es zum Beispiel verdächtig das die Zeilen 15 bis 17 ersatzlos gestrichen werden könnten, ohne das sich am Ergebnis etwas ändert.
davinadavina
User
Beiträge: 4
Registriert: Sonntag 2. Juli 2017, 11:58

Code: Alles auswählen

Liste2 = []
for i in unique_values:
     Liste2.append(Liste1.count(i))

c = []
for i in Liste2:
    c.append(Liste2[i])

print (c)
Liste2
[1, 1, 1, 2, 2, 3, 4, 4, 4, 5, 5, 5, 5, 4, 4, 4, 3, 2, 2, 1, 1, 1]
c
[1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 1]

Danke. Mir ist nun folgendes aufgefallen. Die Liste2 wird geändert. Gebe ich sie als neue Liste c heraus sind die Werte anders. Weshalb ist das so?
Zuletzt geändert von Anonymous am Sonntag 2. Juli 2017, 14:10, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@davinadavina: Was heisst Liste2 wird geändert? Wird sie nicht! Und natürlich ist `c` nicht gleich `Liste2`, das wäre recht unwahrscheinlich. Kannst ja mal überlegen wie die Liste beschaffen sein müsste damit das der Fall wäre.

Ein Unterschied zwischen Ist und Soll ist übrigens auch die Anzahl der Elemente. Du bekommst 22 Elemente, das nach Deiner Aussage richtige Ergebnis hat aber nur 21.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@davinadavina: ich vermute mal, dass Deine „richtige“ Verteilung auch falsch ist. powerset liefert keinen Konstruktor zurück sondern einen Iterator. Du verwendest die Elemente der Liste als Index der Liste. Soweit ich Dein Problem verstanden habe, ist das nicht das was Du möchtest.

Code: Alles auswählen

from collections import Counter
from itertools import chain, combinations

def powerset(iterable):
    """powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3).
   Zurückgegeben wird ein sogenannter Iterator."""
    s = list(iterable)
    return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))

N = {1,2,3,4,5,6}
numbers = [sum(item) for item in powerset(N)]
counts = sorted(Counter(numbers).items())
probabilities = [n/len(numbers) for _, n in counts]
davinadavina
User
Beiträge: 4
Registriert: Sonntag 2. Juli 2017, 11:58

lll
Antworten