2016-03-23 3 views
1

Ich habe ein Tupel und eine zufällige Zeichenfolge:Nehmen Sie eine Zeichenfolge aus einem Tupel - Python

AllSands = "GREEN", "RED", "PINK", "BLACK", "WHITE", "ORANGE", "PURPLE", "BROWN", "GREY" 
found_sand = random.choice(AllSands) 

Aber danach würde Ich mag aus dem Tupel die zufällige Zeichenfolge nehmen, so kann der zufällige Teil sein renne wieder, ohne dass es dieselbe Farbe hat.

Antwort

5

Sie können kein tuple, nur schaffen neue tuple s mutieren. Es wäre einfacher, wenn Sie einen list verwendet:

AllSands = ["GREEN", "RED", "PINK", "BLACK", "WHITE", "ORANGE", "PURPLE", "BROWN", "GREY"] 
found_sand = random.choice(AllSands) 
AllSands.remove(found_sand) 

Natürlich noch einfacher ist, einfach zu mischen und pop je nach Bedarf, die die O(n) Suche entfernt, und kopieren Sie die Arbeits von remove:

AllSands = ["GREEN", "RED", "PINK", "BLACK", "WHITE", "ORANGE", "PURPLE", "BROWN", "GREY"] 
random.shuffle(AllSands) 
found_sand = AllSands.pop() # Each time you call pop, you "find" a new value  
+0

ich Ihre Antwort mögen. ;) –

+0

Danke. Es funktioniert perfekt für mich. – Timothy

2

Tupel sind unveränderlich, daher können sie nicht entfernt werden. Sie können eine neue mit weniger Elementen erstellen.

>>> AllSands = "GREEN", "RED", "PINK", "BLACK", "WHITE", "ORANGE", "PURPLE", "BROWN", "GREY" 
>>> AllSands = AllSands[1:] 
>>> AllSands 
('RED', 'PINK', 'BLACK', 'WHITE', 'ORANGE', 'PURPLE', 'BROWN', 'GREY') 

Aber stattdessen können Sie nur über das schlurfte Tupel iterieren wollen:

AllSands = "GREEN", "RED", "PINK", "BLACK", "WHITE", "ORANGE", "PURPLE", "BROWN", "GREY" 
>>> all_ = list(AllSands) 
>>> random.shuffle(all_) 
>>> all_ 
['WHITE', 'BLACK', 'PURPLE', 'RED', 'PINK', 'ORANGE', 'GREY', 'GREEN', 'BROWN'] 
>>> random.shuffle(all_) 
>>> all_ 
['GREEN', 'BLACK', 'PURPLE', 'GREY', 'PINK', 'BROWN', 'RED', 'WHITE', 'ORANGE'] 
2

würde ich machen AllSands nur eine Liste und shuffle es

>>> AllSands = ["GREEN", "RED", "PINK", "BLACK", "WHITE", "ORANGE", "PURPLE", "BROWN", "GREY"] 
>>> import random 
>>> random.shuffle(AllSands) 
>>> AllSands 
['BROWN', 'WHITE', 'ORANGE', 'GREY', 'PINK', 'PURPLE', 'GREEN', 'BLACK', 'RED'] 

Wenn Sie wissen, dass Sie gewonnen ‚Müssen t die ganze Liste, Sie sample intead

>>> random.sample(AllSands, 3) 
['PINK', 'BROWN', 'ORANGE'] 

Diese Wege sind effizienter als die Wahl eines zufälligen Element zu einem Zeitpunkt verwenden können, und entfernen Sie sie dann aus der Liste/Tupel

Sie auch haben könnte Funktion, die einen Iterator zurückgibt, wie diese

>>> def shuffler(items): 
...  items = list(items) 
...  random.shuffle(items) 
...  return iter(items) 
... 
>>> sands = shuffler(AllSands) 
>>> next(sands) 
'RED' 
>>> next(sands) 
'PURPLE' 
>>> next(sands) 
'WHITE' 
>>> next(sands) 
'GREEN' 
0

eine effiziente Möglichkeit wäre, Ihre Tupel mit einer Liste und gehen Sie wie folgt zu ersetzen:

AllSands = ["GREEN", "RED", "PINK", "BLACK", "WHITE", "ORANGE", "PURPLE", "BROWN", "GREY"] 
index = random.randrange(len(AllSands)) 
found_sand = AllSands.pop(index) 
+0

Es ist nicht wirklich so effizient wie 'pop (index)' muss jedes Mal, wenn es aufgerufen wird, eine Reihe von Elementen in der Liste verschieben. siehe @ ShadowRanger's Antwort, die dies vermeidet, indem nur vom Ende der Liste gepoppt wird –

+0

Verschiebt sich nicht auch ein Haufen Artikel in der Liste? –

+2

Ja, aber nur einmal. Dies ist der Unterschied zwischen O (n) und O (n ** 2) –

0

Sie können random.shuffle() verwenden zu bekommen, was Sie wollen, aber wenn Sie wirklich „löschen“ wollen ein Element aus einem Tupel (eigentlich Tupel inmutable) Versuchen Sie folgendes:

import random 
AllSands = "GREEN", "RED", "PINK", "BLACK", "WHITE", "ORANGE", "PURPLE", "BROWN", "GREY" 
found_sand = random.choice(AllSands) 
AllSands = tuple(x for x in AllSands if x != found_sand) 
found_sand = random.choice(AllSands) 
Verwandte Themen