2012-03-28 1 views
1

Ich versuche, eine Aufgabe zu erfüllen, aber einige difficulty.Can jemanden mit setzte mich gerade auf die folgenden:Wie anderen Wert Schlüssel in einem Wörterbuch überprüfen, gleichzeitig Listenkomprehensionen mit

#This worked for me 
myFormats = {'audio': ('.wav', '.wma', '.mp3'), 'video': ('.mpg', '.mp4', '.mpeg')} 

myFile = '5DeadlyVenoms.mp3' 
f_exten = (x for x in myFormats['audio'] + myFormats['video'] if myFile.endswith(x)) 
extension = f_exten.next() 

Mit der Folge folgenden in diesem Fehler:

myFormats = {'audio': {'.wav', '.wma', '.mp3'}, 'video': {'.avi', '.mpg', '.mp4', '.mpeg'}} 

Traceback:

Traceback (most recent call last): 
File "C:\Users\GVRSQA004\Desktop\udCombo.py", line 65, in fileFormats 
f_exten = (x for x in myFormats['audio'] + myFormats['video'] if myFile.endswith(x)) 
TypeError: unsupported operand type(s) for +: 'set' and 'set' 
Traceback (most recent call last): 
File "C:\Users\GVRSQA004\Desktop\udCombo.py", line 65, in fileFormats 
f_exten = (x for x in myFormats['audio'] + myFormats['video'] if myFile.endswith(x)) 
TypeError: unsupported operand type(s) for +: 'set' and 'set' 
+0

Können Sie klären, was Sie zurückgeben möchten, und auch den Rest des Codes (die Zeile, dass Fehler nicht im ersten Snippet ist). –

Antwort

2

Dies ist Ihr Fehler:

myFormats['audio'] or myFormats['video'] 

Dies wird immer einfach myFormats['audio'] zurückkehren, denn dies ist eine logische or ist. Was Sie wollten stattdessen war die beiden Tupel angefügt:

myFormats['audio'] + myFormats['video'] 

Eine noch bessere Lösung wird mit set ‚s und einen Generator:

formats = {'audio': {'.wav', '.wma', '.mp3'}, 'video': {'.mpg', '.mp4', '.mpeg'}} 

myfile = '5DeadlyVenoms.mp3' 
extensions = (x for x in formats['audio'] + formats['video'] if myfile.endswith(x)) 
extension = extensions.next() 
+0

Ah, ich verstehe. Danke für die Erklärung. – suffa

+0

Die Verwendung eines Wörterbuchs anstelle von Sets funktionierte für mich. Wenn ich Sätze ausprobierte, bekam ich den aktualisierten Traceback-Fehler. – suffa

1
[x for v in myFormats.itervalues() for x in v if myFile.endswith(x)] 

kehrt

['.mp3'] 

Sind Sie das? wollen?

1

Möchten Sie wirklich eine Liste aller passenden Dateierweiterungen? Es sieht so aus, als ob du nur den ersten benutzt.

Falls nicht:

>>> myFormats = {'audio': {'.wav', '.wma', '.mp3'}, 'video': {'.mpg', '.mp4', '.mpeg'}} 
>>> 
>>> myFile = '5DeadlyVenoms.mp3' 
... 
>>> def get_extension(file_name, formats): 
...  for key, extensions in formats.items(): 
...   for extension in extensions: 
...    if file_name.endswith(extension): 
...     return extension 
... 
>>> myFile_extension = get_extension(myFile, myFormats) 
>>> myFile_extension 
'.mp3' 

Dies würde ermöglicht es Ihnen, leicht zu modifizieren, den Schlüssel (das heißt Audio oder Video) zurück, wenn man sie braucht, oder es in einen Generator drehen, wenn Sie mehrere Erweiterungen wollen.

Verwandte Themen