2012-01-02 10 views
1

這是一些什麼列表中的搜索字典項的補充問題我最近查詢:籤蟒如果dictonaries清單不包含特定值

Check if python dictionary contains value and if so return related value

我有一個包含一個數組在格式字典:

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

我才得以回到fileMod值的列表使用 相當整齊的列表中理解文件列表中現有項目的建議:

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

這將返回一個值,如果有一個匹配的文件名,但我忘了包括,我還需要知道什麼時候有一個文件名與filelist中的任何條目不匹配。

我相信這應該很簡單,但我認爲我只是看了太久纔看到樹林。

+0

你想爲一個特定的文件名或爲所有這些做到這一點? – Kos 2012-01-02 10:26:36

+0

只需檢查'fileMod'列表是否爲空? – kennytm 2012-01-02 10:26:56

+1

我用@ PaulHankin對這個問題的回答給出了同樣的建議,對你之前的問題發表了評論。除非有重複的文件名,否則您應該使用文件名作爲關鍵字的字典,而不是字典列表。在這種情況下,你可以'文件名'在文件中**,但als **文件名不在文件中,這樣可以解決你的兩個問題 – 2012-01-02 10:49:07

回答

5

也許你應該使用字典而不是列表?

files = { 
    'file1.txt': {'fileMod': '0000048723'}, 
    'file2.txt': {'fileMod': '0000048723'} 
} 

此存儲相同的信息列表,但找到的元素很簡單:

mod = None 
if 'file1.txt' in files: 
    mod = files['file1.txt']['fileMod'] 
+0

我會強調,查找元素與您的字典是**更快**。芬奇應該重新思考他使用列表和詞典的方式...... – jimifiki 2012-01-02 10:44:59

+0

最後,我決定你是對的,我通過使用字典而不是列表簡化了所有內容。 – Finglish 2012-01-02 18:22:21

2

「簽入蟒如果dictonaries的列表不包含特定值」

if not any(item for item in fileList if item['fileName'] == filename): 

返回true,如果在列表中沒有字典滿足條件。

這可能比檢查整個fileMod更快,因爲一旦找到匹配就會停止。


「這會返回一個值,如果有匹配的文件名,但我忘了,包括我還需要知道什麼時候有不符合任何在文件列表中的條目的文件名。」(不同的問題?)

fileMod = [] 
fileBad = [] 
for item in fileList: 
    if item['fileName'] == filename: 
     fileMod.append(item['fileMod']) 
    else: 
     fileBad.append(item['fileMod']) 

fileMod = {True: [], False: []} # a dictionary of lists 
for item in fileList: 
    fileMod[item['fileMod'] == filename].append(item['fileMod']) 

這最後的代碼返回列表的字典:fileMod[True]是積極開創的列表,fileMod[False]爲負創立的列表。

2

如果文件名與文件列表中的任何條目不匹配,則列表fileMod將爲空。

>>> if fileMod: 
...  # Code when the filename matches at least one file 
... else: 
...  # Code when the filename doesn't match any entry. 

要檢查空列表中的Python:

>>> l = [] 
>>> if l: 
...  print "not empty" 
... else: 
...  print "empty" 
... 
empty 
+0

我試過這個,但由於某些原因,當fileMod長度爲0時,其他的從不會觸發 – Finglish 2012-01-02 11:29:39

+0

檢查fileMod的長度... – jimifiki 2012-01-02 11:38:45

+0

您不需要檢查長度。我正在添加示例代碼來顯示。 – varunl 2012-01-02 11:48:34

0

請注意,

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

返回修改日期(而不是值)的列表, 如果列表長度爲零,那麼fileList中沒有與文件名相匹配的項目。

+0

好吧,我幫你。唯一的問題是,如果我在每次調用後打印len(fileMod),它只會輸出fileMod長度,如果fileMod包含值,並且由於某種原因不會返回0 – Finglish 2012-01-02 11:14:52

+0

試試這個: fileMod = [item ['fileMod'] for如果item ['fileName'] ==「file3.txt」] if len(fileMod): print fileMod else: print「NoFile」 – jimifiki 2012-01-02 11:43:54

相關問題