Проверьте, существует ли ключ словаря, не None и не пустой - PullRequest
0 голосов
/ 03 мая 2018

У меня есть код, который работает, но мне интересно, есть ли более питонский способ сделать это. У меня есть словарь, и я хочу посмотреть, если:

  • ключ существует
  • это значение не None (в данном случае NULL от SQL)
  • это значение не просто кавычка (пусто?)
  • это значение не только состоит из пробелов

Так что в моем коде ключи «a», «b» и «c» будут успешными, и это правильно.

import re

mydict = {
"a":"alpha",
"b":0,
"c":False,
"d":None,
"e":"",
"g":"   ",
}

#a,b,c should succeed
for k in mydict.keys():
    if k in mydict and mydict[k] is not None and not re.search("^\s*$", str(mydict[k])):
        print(k)
    else:
        print("I am incomplete and sad")

То, что у меня есть выше, работает, но это похоже на ужасно длинный набор условий. Может быть, это просто правильное решение, но мне интересно, есть ли более питоническое «существует и имеет вещи» или лучший способ сделать это?

UPDATE Спасибо всем за прекрасные ответы и вдумчивые комментарии. С некоторыми пунктами и советами я немного обновил вопрос, так как были некоторые условия, которых у меня не было, которые также должны быть успешными. Я также изменил пример на цикл (просто проще проверить?).

Ответы [ 6 ]

0 голосов
/ 03 мая 2018

это проверка точно для NoneType не только None

from types import NoneType # dont forget to import this

mydict = {
"a":"alpha",
"b":0,
"c":False,
"d":None,
"e":"",
"g":"   ",
}

#a,b,c should succeed
for k in mydict:
    if type(mydict[k]) != NoneType:
        if type(mydict[k]) != str or type(mydict[k]) == str and mydict[k].strip():
            print(k)
        else:
            print("I am incomplete and sad")
    else:
        print("I am incomplete and sad")
0 голосов
/ 03 мая 2018

cond - это функция генератора, отвечающая за генерацию условий, применяемых в режиме короткого замыкания с использованием функции all. Учитывая d = cond(), next(d) будет проверять, существует ли в диктанте, и так далее, пока нет условий для применения, в этом случае all(d) оценивается как True.

mydict = {
  "a":"alpha",
  "c":None,
  "d":"",
  "e":"   ",
}

def cond ():
  yield 'a' in mydict
  yield mydict ['a']
  yield mydict ['a'].strip ()

if all (cond ()):
    print("I am here and have stuff")
else:
    print("I am incomplete and sad")
0 голосов
/ 03 мая 2018

Что ж, у меня есть 2 предложения, особенно если ваша главная проблема заключается в длине условий.

Первый - для проверки, находится ли ключ в dict. Вам не нужно использовать "a" in mydict.keys(), вы можете просто использовать "a" in mydict.

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

import re

mydict = {
"a":"alpha",
"c":None,
"d":"",
"e":"   ",
}

inKeys = True if "a" in mydict else False
isNotNone = True if mydict["a"] is not None else False
isValidKey = True if not re.search("^\s*$", mydict["a"]) else False

if inKeys and isNotNone and isValidKey:
    print("I am here and have stuff")
else:
    print("I am incomplete and sad")
0 голосов
/ 03 мая 2018

Вы можете использовать понимание списка с str.strip для учета пробелов в строках.

Использование if v естественно в Python для покрытия объектов типа False, например None, False, 0 и т. Д. Обратите внимание, что это работает только , если 0 не является допустимым значением .

res = [k for k, v in mydict.items() if (v.strip() if isinstance(v, str) else v)]

['a']
0 голосов
/ 03 мая 2018

Попробуйте извлечь значение и сохранить его в переменной, затем используйте объект "истинность", чтобы продолжить со значением

v = mydict.get("a")
if v and v.strip():
  • , если "a" не указан, get возвращает None и не выполняет первое условие
  • если "a" указано в поле dict, но выдает None или пустую строку, проверка завершается неудачно, если "a" возвращает пустую строку, strip() возвращает строку с ошибкой и тоже не выполняется.

давайте проверим это:

for k in "abcde":
    v = mydict.get(k)
    if v and v.strip():
        print(k,"I am here and have stuff")
    else:
        print(k,"I am incomplete and sad")

Результаты:

a I am here and have stuff
b I am incomplete and sad    # key isn't in dict
c I am incomplete and sad    # c is None
d I am incomplete and sad    # d is empty string
e I am incomplete and sad    # e is only blanks

если ваши значения могут содержать False, 0 или другие "ложные" нестроки, вам придется проверить строку, в этом случае заменить:

if v and v.strip():

по

if v is not None and (not isinstance(v,str) or v.strip()):

, поэтому условие соответствует, если не None и либо не является строкой (все соответствует), либо, если строка, строка не является пустой.

0 голосов
/ 03 мая 2018

Метод get для проверки, существует ли ключ, более эффективен, чем итерация по ключам. Он проверяет, существует ли ключ без итерации, используя сложность O(1) по сравнению с O(n). Мой предпочтительный метод будет выглядеть примерно так:

if mydict.get("a") is not None and str(mydict.get("a")).replace(" ", "") != '':
    # Do some work
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...