Für die Uni schreibe ich mir gerade ein kleines Programm, das folgendes macht:
Ich habe eine Wahl mit W Wählern und K Kandidaten, wobei jeder Wähler eine Präferenz
liste abgibt, also nicht nur einen Kandidaten wählt, sondern alle in eine Reihenfolge
bringt.
Dann habe ich vier verschiedene Auszählungsverfahren und will schauen, wie viele unterschiedliche
Sieger ich finden kann. In der While-schleife erzeuge ich ein zufälliges Wahrergebniss
und speichere dann in erg die Ergebnisse der einzelnen Verfahren. relativ und borda
lesen nur, wobei Coombs und Preference das Wahlergebniss weiterverarbeiten in dem
manche Kandidaten gestrichen werden. Deswegen wollte ich jeder Funktion eine Kopier
des erzeugten Wahlergebnisses übergeben, was ich über die Slice-Kopie gemacht habe.
Wenn ich aber coombs(copyd) aufrufe, und mich danach copyc anzeigen lasse,
steht in Copyc nicht das ursprüngiche Wahlergebniss, sondern das, was Coombs vom Wahl
ergebniss übrig lässt. (am besten einfach mal ausführen). Es sieht also so aus, als ob
copyd und copyc das gleiche Objekt sind. Wobei
print (copyd is copyc)
print copyd == copyc
False und True ausgeben, was auch so zu erwarten ist.
Wenn ich aber direkt:
L=range(3)
K=L[:]
K.delete(2)
ausführe, besteht L immer noch aus drei Elementen.
Wie komme ich also an eine richtige Kopie? oder besser: wo mache ich meinen Fehler?
Code: Alles auswählen
import random
from Tkinter import IntVar
# Anzahl Kandidaten :
K=5
# Anzahl Wähler:
W=8
def neueWahl():
erg = []
for i in range(W):
a = range(K)
random.shuffle(a)
erg.append(a)
return erg
# vorne in der Liste steht der beste Kandidat!
def relativ(Wahl):
e=[0]*K
for liste in Wahl:
e[liste[0]]+=1
return e.index(max(e))
def borda(Wahl):
e=[0]*K
for liste in Wahl:
for i in range(K):
e[liste[i]]+=W-i-1 #+1 damit der erste Kandidat W-1
# Punkte bekommt
return e.index(max(e))
def MostLastPlaces(Wahl):
e=[0]*K
for liste in Wahl:
e[liste[-1]]+=1
return e.index(max(e))
def LeastFirstPlaces(Wahl):
e=[0]*K
for liste in Wahl:
e[liste[0]]+=1
minimum = W
pos = 0
for i in range(K):
if i not in Wahl[0]:
continue
if e[i]<minimum:
minimum = e[i]
pos = i
return pos
def Preference(Wahl):
if len(Wahl[0])==1:
return Wahl[0][0]
loser = LeastFirstPlaces(Wahl)
# verlierer der Runde wird aus den Listen gestrichen:
# neueWahl =
for liste in Wahl:
liste.remove(loser)
return Preference(Wahl)
def Coombs(Wahl):
if len(Wahl[0])==1:
return Wahl[0][0] # alle Wähler haben gleichen Kandidaten
loser = MostLastPlaces(Wahl)
# verlierer der Runde wird aus den Listen gestrichen:
for liste in Wahl:
liste.remove(loser)
return Coombs(Wahl)
s=set([1])
counter = 0
erg=[0,0,0,0]
while erg[0]==erg[2]:#len(s)<4:
erg = [None]*4
wahlrunde = neueWahl()
copya = list(wahlrunde)#[:]
copyb = list(wahlrunde)#wahlrunde[:]
copyc = list(wahlrunde)#wahlrunde[:]
copyd = list(wahlrunde)#wahlrunde[:]
print "a",copya
erg[0] = relativ(copya)
print "b",copyb
erg[1] = borda(copyb)
print "d",copyd
erg[3] = Coombs(copyd)
print "c",copyc
erg[2] = Preference(copyc)
s = set(erg) # Umwandlung in Menge
counter += 1
#if counter % 2000 ==0:
# print erg
# print counter
break
else:
# print erg
print "fertig: wahl=",wahlrunde