Как проверить ключи разных значений в словаре одновременно, используя списки - PullRequest
1 голос
/ 28 марта 2012

Я пытаюсь выполнить задачу, но испытываю некоторые трудности. Может кто-то прямо указывал мне на следующее:

#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()

Использование следующего привело к этой ошибке:

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'

Ответы [ 3 ]

2 голосов
/ 28 марта 2012

Это ваша ошибка:

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

Это всегда просто возвращает myFormats['audio'], потому что это логический or. Вместо этого вы хотели добавить два кортежа:

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

Еще лучшее решение - использовать set и генератор:

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()
1 голос
/ 28 марта 2012

Вы действительно хотите список всех соответствующих расширений файлов?Похоже, вы просто используете первый.

Если нет:

>>> 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'

Это позволит вам легко изменить его для возврата ключа (т. Е. Аудио или видео), если вынужно или превратить в генератор, если вам нужно несколько расширений.

1 голос
/ 28 марта 2012
[x for v in myFormats.itervalues() for x in v if myFile.endswith(x)]

возвращает

['.mp3']

Это то, что вы хотите?

...