如何使用列表理解同时检查字典中的不同值键

2024-04-19 23:04:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在努力完成一项任务,但是有一些困难。我能有人指使我说:

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

Tags: inforifvideomyfilemp3audiomp4
3条回答
[x for v in myFormats.itervalues() for x in v if myFile.endswith(x)]

退货

['.mp3']

这就是你想要的吗?你知道吗

这是你的错误:

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

你真的想要所有匹配文件扩展名的列表吗?看起来你只是在用第一个。你知道吗

如果没有:

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

这将允许您轻松地修改它,以便在需要时返回密钥(即音频或视频),或者在需要多个扩展时将其转换为生成器。你知道吗

相关问题 更多 >