2012-01-01 28 views
4

我有類型的字典,它包含以下格式的文件名和修改日期的列表:檢查Python字典包含值,如果這樣返回相關值

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

我需要查詢是否存在於一個fileName字典,如果是這樣,則返回該條目的fileMod值。

+0

該字典是進入另一個字典/列表/其他東西或什麼?文件模式如何與文件名相關聯?等......會很高興讓它更清晰:) – 2012-01-01 20:11:13

+0

fileMod如何與fileName相關?你能舉出一個至少有兩個文件名和兩個文件模式的例子嗎? – gruszczy 2012-01-01 20:14:14

+0

對不起,我意識到回頭說它不那麼清楚。我更新了這個問題,以更完整地顯示數據結構 – Finglish 2012-01-01 20:17:02

回答

6

使用列表理解:

fileMod = [item['fileMod'] for item in fileList if item['fileName'] == filename] 
3

您可以使用與filter

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

你也可以做到這一點使用List-Comprehension

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

,或只是一個簡單的迭代

for x in fileList: 
    if x["fileName"]=="filename2.typ": 
     print x["fileMod"] 
3

只是爲了記錄:數據結構是字典的一個列表,而不是一本字典。所以你不能簡單地查詢項目"fileName"的列表。你可以做這樣的:

for filedict in fileList: 
    if filedict.get("fileName") == "myrequestedfile.typ": 
     # to somthing 
     pass 
+0

好點,我需要更清楚。 – Finglish 2012-01-01 20:31:31

2

吧,你已經更新了你的問題,指示類型的字典列表,詹恩指出。但現在你的說法是不正確的:

我檢查是否存在文件名使用,如果文件名的文件列表:語句,它工作正常

裏卡多得到它的權利,你需要的字典modTimes或字典的字典。從您的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>) 
2

可以解決很好地使用generatornext方法這個問題:

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' 
相關問題