2017-03-07 14 views
0
from random import randint 
roomTypes = ['T|', 'M|', 'W|', 'H|', 'C|'] 
dungeonLayout = '' 
for i in range(1,10): 
    dungeonLayout = dungeonLayout.join(roomTypes[randint(0, 4)]) 
print('Room types are Temple |T|, Abandoned Military Base |M|, Wizard\'s Abodes |W|, House |H|, Church |C|') 
print('_____________________________') 
print('|' + dungeonLayout) 
print('_____________________________')` 

Mein Code (die oben gezeigt wird) soll eine zufällige Liste der Zimmer zurück, diese Art von Arbeiten, aber statt der Räume wie folgt formatiert:.join() liefert unerwartete Zeichenfolge

|W|H| 

druckt:

|WH|| 

ich bin neugierig, warum das so ist und habe mich gefragt, ob ich mit dem join Befehl falsch oder ob ich überhaupt einen anderen Befehl verwenden.

+0

Was wird ' 'W |' .join ('H |')' zurückkehren? –

+0

@PeterWood Ich würde erwarten, dass es zurückgibt W | H |, aber es gibt WH ||, ich benutze Python 3.5.2 Wenn das hilft – Harvey

+0

@Harvey gegeben was 'str.join' tut, das scheint nicht sinnvoll Erwartung. Beachten Sie, dass z.B. '' ''. join (' foo ')' ist '' f, o, o''. – jonrsharpe

Antwort

4

Sein, weil diese Linie -

for i in range(1,10): 
    dungeonLayout = dungeonLayout.join(roomTypes[randint(0, 4)]) 

Sie ändern dungeonLayout und verwenden es wieder um die Liste zu kommen.

Was sollten Sie tun -

dungeonLayout = ''.join([roomTypes[randint(0, 4)] for _ in range(10)]) 
+0

gibt es eine Möglichkeit, dies dauerhaft zu machen, weil ich diese Informationen für die spätere Verwendung im Programm speichern möchten. – Harvey

+0

@Harvey Ich habe die Antwort bearbeitet. – hashcode55

0

Stattdessen könnten Sie verwenden:

dungeonLayout = dungeonLayout + roomTypes[randint(0,4)] 

Das die produziert "| T | C | M | T | M | C | C | C | C |" Stilausgabe.

0

my_str.join eine Sammlung nimmt (das heißt ein iterable) von Strings und gibt diese zusammengeklebt Strings mit my_str, z.B.

"x".join(["1", "2", "3"]) 
# "1x2x3" 

und z.B.

"x".join("A|") 
# Ax| 

weil A | ist eine Sammlung von "A" und "|".

Sie könnten vielleicht die Schleife beheben, aber es ist besser, ein Verständnis zu verwenden:

"".join(roomTypes[randint(0,4)] for i in range(1,10)) 
0

Statt

dungeonLayout = dungeonLayout.join(roomTypes[randint(0, 4)])

Sie wahrscheinlich

gemeint

dungeonLayout += roomTypes[randint(0, 4)]

Ihre aktuellen Code wird Wählen Sie eine zufällige zweistellige Zeichenfolge aus RoomTypes aus, behandeln Sie sie als eine Folge von Buchstaben, und verbinden Sie sie mit der Variablen dungeonLayout als Trennzeichen, sodass die resultierende Zeichenfolge someRoomType[0] + dungeonLayout + someRoomType[1] lautet.

Sie könnten auch die komplette ‚für‘ Schleife durch den folgenden Code ersetzen, die die Idee der „nehmen 10 zufällige Raumtypen und kommen sie zusammen“ zum Ausdruck bringt: hier

from random import choices dungeonLayout = ''.join(choices(roomTypes, k=10))

2

join beschrieben https://docs.python.org/2/library/stdtypes.html#str.join und zusammenfassend verwenden Sie die str als Kleber zwischen jedem Element in einem gegebenen iterable.

Da Sie im Grunde eine Liste von "Räumen" erstellen möchten, können Sie eine randomRooms Liste verwenden, um eine Liste zufälliger Zimmertypen zu speichern, und dann die join Funktion nur verwenden, um es im gewünschten Format zu speichern. Beachten Sie, dass Sie am Anfang und am Ende noch ein Trennzeichen hinzufügen müssen. Hier das Beispiel mit minimalem Code diff zu Ihrem.

from random import randint 
roomTypes = ['T', 'M', 'W', 'H', 'C'] 
randomRooms = [] 
for i in range(1,10): 
    randomRooms.append(roomTypes[randint(0, 4)]) 
dungeonLayout = '|' + '|'.join(randomRooms) + '|' 
print('Room types are Temple |T|, Abandoned Military Base |M|, Wizard\'s Abodes |W|, House |H|, Church |C|') 
print('_____________________________') 
print(dungeonLayout) 
print('_____________________________') 

Auch auf https://eval.in/750197

0

Sie sind hier!

from random import randint 
roomTypes = ['T|', 'M|', 'W|', 'H|', 'C|'] 
dungeonList = [] 
dungeonLayout = "" 
for i in range(1,10): 
    dungeonList.append(roomTypes[randint(0, 4)]) 

dungeonLayout = dungeonLayout.join(dungeonList) 
print(dungeonLayout) 
print('Room types are Temple |T|, Abandoned Military Base |M|, Wizard\'s Abodes |W|, House |H|, Church |C|') 
print('_____________________________') 
print('|' + dungeonLayout) 
print('_____________________________') 

Da Sie jedes Mal beitreten, wurde das Programm verwirrt. Stattdessen habe ich alle Randoms in die Liste eingefügt und bin dann einmal beigetreten. Wenn Sie die gleiche Sache viele Male kommen, wird der Computer

0

Ein paar Optionen zur Fehler beginnen ...

Die einfachste der + Operator zu verwenden ist, jeden neuen Raum der Zeichenfolge verketten:

dungeonLayout = dungeonLayout + roomTypes[randint(0, 4)] 

Aber Sie haben Recht, die Join() -Methode funktioniert etwas anders. Das Argument sollte eine Folge von Strings sein, die die Zeichenfolge als Trennzeichen verkettet verwenden, dh

separator = '|' 
myList = ['1', '2', '3'] 
print(separator.join(myList)) 

1|2|3 

(So zu verwenden beizutreten gibt) in Ihrem Fall:

from random import randint 
roomTypes = ['T', 'M', 'W', 'H', 'C'] 
roomList = [] 
for i in range(1,10): 
    roomList.append(roomTypes[randint(0, 4)]) 
dungeonLayout = '|'.join(roomList) + '|' 
print('Room types are Temple |T|, Abandoned Military Base |M|, Wizard\'s Abodes |W|, House |H|, Church |C|') 
print('_____________________________') 
print('|' + dungeonLayout) 
print('_____________________________') 

Hoffe, dass hilft!

0

Es ist sehr einfach zu bearbeiten, ändern, nur

dungeonLayout = dungeonLayout.join(roomTypes[randint(0, 4)]) 

zu

dungeonLayout = dungeonLayout + roomTypes[randint(0, 4)] 

Stattdessen verbinden zu verwenden, + nur verwenden Hier ist volles Programm

from random import randint 
roomTypes = ['T|', 'M|', 'W|', 'H|', 'C|'] 
dungeonLayout = '' 
for i in range(1,10): 
    dungeonLayout = dungeonLayout + roomTypes[randint(0, 4)] 
print('Room types are Temple |T|, Abandoned Military Base |M|, Wizard\'s Abodes |W|, House |H|, Church |C|') 
print('_____________________________') 
print('|' + dungeonLayout) 
print('_____________________________') 
rand1 = randint(0, 4) 

Ex Ausgang: | T | W | M | M | W | M | C | H | T |

1
dungeon_layout = '|' + ''.join(random.choice(room_types) for _ in range(15)) 

Der obige Code ersetzt die for-Schleife, die ich hinzugefügt und behebt das Problem und gibt die richtige Menge der Zimmer, Gutschrift auf @jDo geht, vielen Dank.

+0

Ach ja, ich habe vergessen zu erwähnen, dass ich 'roomTypes = ['T |', 'M |', 'W |', 'H |', 'C |']' zu 'room_types = ['T' geändert habe, "M", "W", "H", "C"] bevor ich den Kommentar so geschrieben habe 'dungeon_layout = '|' + '|' .join (random.choice (room_types) für _ im Bereich (10)) + '|' 'produziert' '| W | T | T | T | T | C | W | T | T | T | "". Wie auch immer, danke, froh, dass es funktioniert :) – jDo

0

str.join (iterable)

Return eine Zeichenkette, die die Verkettung der Strings in der iterable iterable ist. Das Trennzeichen zwischen Elementen ist die Zeichenfolge, die diese Methode bereitstellt.

src = https://docs.python.org/2/library/stdtypes.html#str.join

so, aus der Erklärung ..es gibt die Verkettung von Strings in iterable iterable zurück.

, wenn Sie Ihre gewünschte Ergebnis möchten, gehen Sie einfach:

dungeonLayout = dungeonLayout + roomTypes[randint(0,4)]

Verwandte Themen