2016-10-28 5 views
0

Ich beschäftige mich mit etwas Mysterium und hoffe auf etwas Klarheit. Ich schrieb ein Skript für die Suche nach Würfelkombinationen Rolle zu 24 hinzufügen, die wie folgt aussieht:Erstellung eines unerwarteten Tupelwertes

start=[3,3,3,3,3,3,3,3] 
outcomes=set(tuple(start)) #Use a set to ensure uniqueness 

index_list=np.random.randint(0,8,1000) 

#This little snippet adds one and subtracts one randomly, keeping total at 24 
for i in xrange(0,500): 
    upper=index_list[i] 
    downer=index_list[i+20] 

    if start[upper]!=6 and start[downer]!=1: 
     start[upper]=start[upper]+1 
     start[downer]=start[downer]-1 
     outcomes.add(tuple(start)) 

print outcomes 

Was ich in laufen lasse, ist, dass wenn ich auf die Ergebnisse schauen, gibt es eine einzige 3 vom Typ ‚int‘ in Dort.

set([(4, 4, 4, 3, 2, 2, 2, 3), 3, (2, 5, 4, 3, 1, 4, 2, 3), (4, 4, 4, 2, 3, 1, 3, 3),(4, 2, 5, 2, 3, 4, 1, 3)]) 

Während ich es sicherlich entfernen konnte, bin ich nur neugierig, wie es ist, damit zu beginnen? Meine anfängliche Vermutung war, dass die Indexliste einen Index außerhalb von [0-7] erzeugen könnte, ist es aber nicht. Ich habe an anderen Stellen nach einer ähnlichen Frage gesucht, habe aber noch ein ähnliches Problem gefunden. Vielen Dank!

Antwort

1

set erwartet eine iterable. Sie übergeben eine tuple, die eine iterable ist. set iteriert durch und hinterlässt nur 1 Wert: 3 (weil Ihr Tupel nur den gleichen Wert 3 enthält).

Sie haben Ihr Element in einer Liste oder Tupel zu setzen, so dass es als ein einzelnes Element zu sehen ist (genau das gleiche Problem, wenn Sie eine Zeichenfolge, und es wird unerwartet wiederholt auf Pass)

Der Rest des Codes ist OK und hat nichts mit dem Problem zu tun.

Tun Sie dies statt:

outcomes=set([tuple(start),]) 

jetzt set iteriert durch eine Liste von 1 Tupel, effektiv zu schaffen tuple Elemente.

Sie könnten das auch tun, vielleicht einfacher:

outcomes=set() 
outcomes.add(tuple(start)) 

es keine Zweideutigkeit ist, da Sie 1 Element hinzufügen. Es wird nicht durchlaufen.

+0

Ahh das macht Sinn! Wer hat das abgelehnt? Warum hast du das gemacht? Ist das nicht eine pythonische Art, dies zu tun, oder gibt es einen anderen Grund, es zu verwerfen? –

+0

Ich wollte den Kommentar kommentieren. Jemand, der die Frage falsch verstanden hat ... Ich verstehe es auch nicht. –

+1

@MasonGardner Ich habe nicht downvote, aber der Grund, warum ich nicht upvote, ist, dass die Erklärung meiner Meinung nach ein wenig irreführend/unlängst ist. 'set' erwartet ein iterables, aber [tuples * sind * iterables] (https://docs.python.org/2/glossary.html#term-iterable) - diese Antwort klingt so, als wären sie nicht. Der Grund, warum Sie "3" erhalten, ist, dass dies der einzige eindeutige Wert in "(3, 3, 3, 3, 3, 3, 3, 3)" ist. – elethan

Verwandte Themen