2012-01-02 68 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