2017-12-31 43 views
0

Hye. Wie kann ich eine Zeichenfolge in eine Variable ändern, die ich zuvor definiert habe? mein CodeWie konvertiert man 'A' zu A?

Dies ist:

A = 'A.mpeg' 
B = 'B.mpeg' 
C = 'C.mpeg' 
D = 'D.mpeg' 
E = 'E.mpeg' 
F = 'F.mpeg' 
G = 'G.mpeg' 

k = 'AAABBCCDD' 
k = list(k) 
print(k) 
for i in range(len(k)): 
    print(i, k[i]) 
    pygame.mixer.music.load(k[i]) 
    pygame.mixer.music.play() 
    time.sleep(0.7) 

Der Fehler, den ich bekommen ist pygame.error: Couldn't open 'A'. Ich nehme an, ich muss k [0] = 'A' in nur A als die Variable A konvertieren, die ich zuvor definiert habe.

Vielen Dank.

Antwort

1

Versuchen

A = 'A.mpeg' 
B = 'B.mpeg' 
C = 'C.mpeg' 
D = 'D.mpeg' 
E = 'E.mpeg' 
F = 'F.mpeg' 
G = 'G.mpeg' 

k = [A,B,C,D,E,F,G] 
for i in range(len(k)): 
    print(i, k[i]) 
    pygame.mixer.music.load(k[i]) 
    pygame.mixer.music.play() 
    time.sleep(0.7) 

Zuvor versuchen Sie eine Datei 'A' genannt zu laden, die ich davon ausgehen, gab es nicht.

+0

dies nicht erreichen was sein Code bewirkt. In Ihrer Liste erscheinen alle Variablen genau einmal; in diesem Fall kann ein einzelner Buchstabe mehrmals in der Liste erscheinen. In diesem Fall wird die entsprechende Musikdatei so oft abgespielt, wie sie erscheint. – ubadub

+0

Presume Poster bedeutet 'k = [A, A, A, B, B, C, C, D, D]'. Beachten Sie, 'für i, f in enumerate (k):' wäre eine kanonische Lösung, gegen 'range()' und Indizierung. – AChampion

+0

'k = [A, A, A, B, B, C, C, D, C]' funktioniert, aber ich möchte die Eingabe als eine Zeichenkette 'AAABBCCD' sein, da es für den Benutzer einfacher zu schreiben ist. – rmrlearn

-1

Versuchen Sie stattdessen:

for i in range(len(k)): 
    print(i, k[i]) 
    pygame.mixer.music.load(globals()[k[i]]) 
    pygame.mixer.music.play() 
    time.sleep(0.7) 
+1

Hinweis: Die Verwendung von 'globals()' ist zerbrechlich, da sie brechen würde, wenn dies in einer Funktion definiert ist. Es ist generell kein guter Stil, 'globals()' so zu verwenden, dass ich dies nicht als Lösung empfehlen würde. – AChampion

+0

für die Einheimischen() kann verwendet werden, stimme ich zu, Ihre Lösung ist besser, aber ich weiß nicht, wofür OP es verwendet? –

4

Alternativ kann ein dict verwendet werden könnten, zum Beispiel:

files = { 
    'A': 'A.mpeg', 
    'B': 'B.mpeg', 
    ... 
} 
k = 'AAABBCCDD' 
for i, f in enumerate(k): 
    print(i, files[f]) 
    pygame.mixer.music.load(files[f]) 
    pygame.mixer.music.play() 
    time.sleep(0.7) 
+0

In diesem Fall könnte es auch einfach sein: 'file = f + '.mpeg'' .. obwohl ein Wörterbuch (oder eine andere Mapping-Funktion) potentiell flexibler ist. Immer noch eine Abstimmung für das Zeigen von Vielfalt/Mapping über 'dict'. – user2864740

+1

Noch besser, Sie können die Werte des Dikters zu einem Tupel machen, dessen erstes Element der Name ist, und das zweite Element ist die Anzahl der Male, also zum Beispiel: ''A': ('A.mpeg', 4), "B": ("B.mpeg", 2) usw. – ubadub

+0

Einverstanden, beachten Sie, was das OP zu erreichen versucht. – AChampion

0

können Sie verwenden, um die eval Funktion:

A = 'A.mpeg' 
B = 'B.mpeg' 
C = 'C.mpeg' 
D = 'D.mpeg' 
E = 'E.mpeg' 
F = 'F.mpeg' 
G = 'G.mpeg' 

k = [A,B,C,D,E,F,G] 
for i in range(len(k)): 
    print(i, k[i]) 
    pygame.mixer.music.load(eval(k[i])) 
    pygame.mixer.music.play() 
    time.sleep(0.7) 
Verwandte Themen