словарь ключа и списка - удалить ключ, если какое-либо значение в списке отсутствует

1

У меня есть словарь в следующем формате,

mydict = 

{ a: [1, 2],
  b: [2, 2],
  c: [1, 0],
  d: [1, 1]
}

если какое-либо значение None

{ a: [1, None],
  b: [2, 2],
  c: [1, 0],
  d: [1, 1]
}

Я хочу удалить эту пару key:value.

выход должен быть

    {
      b: [2, 2],
      c: [1, 0],
      d: [1, 1]
    }

я печатаю это так,

for key, values in mydict.items():
    print key, values
    .
    .
    .

Я хочу удалить None не запустив новый цикл в моем цикле for поэтому я попробовал это,

Я попробовал это,

for key, values in mydict.items() if values.items is not None:

но он продолжает давать мне неверную синтаксическую ошибку,

SyntaxError: invalid syntax
Теги:

5 ответов

2
Лучший ответ

менять

for key, values in mydict.items():  
    print key, values

в

for key, values in mydict.items():  
    if (None not in values):  
        print key, values
  • 0
    спасибо это то что я хотел
3

Используйте понимание словаря:

d = { 'a': [1, None],
      'b': [2, 2],
      'c': [1, 0],
      'd': [1, 1] }

print({k:v for k, v in d.items() if None not in v})
# {'b': [2, 2], 'c': [1, 0], 'd': [1, 1]}

Если вам нужен цикл, подобный вашему:

for key, value in d.items():
    if None not in value:
        print(key, value)
        # do your calculations here
  • 0
    Вы победили меня за 1 секунду
  • 0
    Я хочу сделать это внутри себя for цикла, это не помогает мне.
Показать ещё 2 комментария
2

Ты можешь попробовать

mydict = { 'a': [1, None],
      'b': [2, 2],
      'c': [1, 0],
      'd': [1, 1]
    }

from copy import copy

newdict = copy(mydict)

for key, values in mydict.items():
    if None in values:
      newdict.pop(key)

print newdict
  • 0
    Можно ли сделать это без копирования словаря, так как его очень большой
  • 0
    Просто используйте mydict вместо newdict (работает в Python 2.7, но показывает ошибку RuntimeError: dictionary changed size during iteration в Python 3.x). Я использовал копирование, чтобы предотвратить это, так как мы меняем содержимое словаря, перебирая его.
1

Попробуйте использовать filter + lambda:

d=dict(filter(lambda x: None not in x[1], list(d.items())))
print(d)

Или с циклом for:

newd = {}
for k,v in d.items():
   if not None in v:
      newd.update({k:v})
  • 0
    для меня это лучший подход
  • 0
    но тогда я должен пройти через newd
0

Использование dictionary comprehension

your_dict = {key:value for key,value in my_dict.items() if None not in value}

Выход:

{'b': [2, 2], 'c': [1, 0], 'd': [1, 1]}
  • 2
    Ваш ответ точно такой же, как ответ @ Остина
  • 0
    Ops! Когда я начинаю писать свой ответ, в этом вопросе нет ответа. Вот почему я не заметил его ответа.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню