Проверьте, содержит ли словарь python значение, и если да, верните соответствующее значение - PullRequest
4 голосов
/ 02 января 2012

У меня есть список диктов, которые содержат имена файлов и даты изменения в следующем формате:

fileList = [{"fileName": "file1.txt", "fileMod": "0000048723"}, 
            {"fileName": "file2.txt", "fileMod": "0000098573"}]

Мне нужно запросить, существует ли в словаре fileName, и если да, вернуть значение fileMod для этой записи.

Ответы [ 5 ]

6 голосов
/ 02 января 2012

Использование списка понимания:

fileMod = [item['fileMod'] for item in fileList if item['fileName'] == filename]
3 голосов
/ 02 января 2012

Только для записи: ваша структура данных - это список словарей, а не словарь. Таким образом, вы не можете просто запросить список для элемента "fileName". Вы можете сделать это так:

for filedict in fileList:
    if filedict.get("fileName") == "myrequestedfile.typ":
        # to somthing
        pass
3 голосов
/ 02 января 2012

Вы можете использовать лямбда с фильтром .

>>> fileList = [{"fileName": "filename1.typ", "fileMod": "0000000001"}, {"fileName": "filename2.typ", "fileMod": "0000000002"}]
>>> filter(lambda x:x["fileName"]=="filename2.typ",fileList)[0]['fileMod']
'0000000002'

Вы также можете сделать это, используя Список-понимание

[x['fileMod'] for x in fileList if x["fileName"]=="filename2.typ"][0]

Или просто итерация

for x in fileList:
    if x["fileName"]=="filename2.typ":
        print x["fileMod"]
2 голосов
/ 02 января 2012

Вы можете решить эту проблему с помощью generator и next метода:

next(x['fileMod'] for x in fileList if x['fileName'] == 'my filename')

Конечно, это поднимает StopIteration ошибка, если генератор пуст (в вашем списке не было указания с fileName == 'my filename').Вы можете избежать ошибки, вызванной:

try:
    next(x['fileMod'] for x in fileList if x['fileName']=='my filename')
except StopIteration:
    print 'Oops! file not found'
2 голосов
/ 02 января 2012

Правильно, вы обновили свой вопрос, чтобы указать список диктов, как указала Джанн.Но теперь ваше утверждение неверно, что:

Я проверяю, существует ли fileName, используя if filename в filelist: утверждении, которое работает правильно

Рикардо понял все правильноВам нужен режим модов или режим диктов.Легко создается из вашего fileList с:

fileList = dict((f['fileName'],f) for f in fileList) 
mod = fileList.get('file1.txt',<default>)
# or
fileList = dict((f['fileName'],f) for f in fileList)
mod = fileList.get('file1.txt',{}).get('fileMod',<default>)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...