在Python中检查字典列表是否不包含特定值

1 投票
4 回答
3585 浏览
提问于 2025-04-17 09:23

这是我最近关于在列表中搜索字典项的提问的一个补充问题:

检查Python字典是否包含某个值,如果包含则返回相关值

我有一个数组,里面包含了格式为字典的数据:

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

我能用一种很简洁的列表推导式,返回文件列表中已有项的fileMod值:

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

这个方法能返回一个值,如果有匹配的文件名,但我忘了提到,我还需要知道有没有文件名不匹配文件列表中的任何条目。

我相信这应该很简单,但我觉得我看得太久了,反而看不清楚问题的本质。

4 个回答

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
2

"在Python中检查一个字典列表是否不包含特定值"

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

如果你的列表中没有任何字典满足条件,就会返回真。

这样做可能比检查整个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]是没有找到的匹配项列表。

5

也许你应该用字典而不是列表呢?

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

这样可以存储和你的列表一样的信息,但查找元素就简单多了:

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

撰写回答