регистрация Python, если список диктонар НЕ содержит определенного значения - PullRequest
1 голос
/ 02 января 2012

Это дополнительный вопрос к моему недавнему запросу о поиске элементов словаря в списке:

Проверить, содержит ли словарь python значение, и если да, вернуть соответствующее значение

У меня есть массив, содержащий словари в формате:

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

Мне удалось вернуть список значений fileMod для существующих элементов в fileList, используя довольно аккуратное понимание списка, как было предложено:

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

Возвращает значение, если существует совпадающее имя файла, но я забыл указать, что мне также нужно знать, когда существует имя файла, которое не соответствует ни одной из записей в списке файлов.

Я уверен, что это должно быть просто, но я думаю, что просто слишком долго смотрел на него, чтобы увидеть деревья для деревьев.

Ответы [ 4 ]

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

Возможно, вам следует использовать словарь, а не список?

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

Здесь хранится та же информация, что и в вашем списке, но найти элементы легко:

mod = None
if 'file1.txt' in files:
    mod = files['file1.txt']['fileMod']
2 голосов
/ 02 января 2012

Если имя файла не соответствует ни одной записи в списке файлов, список 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 голосов
/ 02 января 2012

"регистрация Python, если список диктонар НЕ содержит определенного значения"

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] - это список отрицательных результатов.

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

Обратите внимание, что

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

возвращает список дат изменений (не значение), если список имеет нулевую длину, то в fileList нет элементов, соответствующих имени файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...