2017-01-05 7 views
2

Итак, у меня есть словарь, наполненный множеством полезных вещей. Я хотел бы удалить ключ (построить новый dict без ключа), если какое-либо значение в списке пуст.Python3 Удаление словарного ключа, если значение, содержащееся в списке, пуст

Словарь:

>>>print(vaar123) 
{'moo': 'cora', 'ham': ['', 'test'], 'bye': 2, 'pigeon': '', 'heloo': 1} 

можно удалить ключ «голубиной» с его пустым значением с чем-то вдоль линий.

>>>dict((k, v) for k, v in vaar123.items() if v) 
{'moo': 'cora', 'ham': ['', 'test'], 'heloo': 1, 'bye': 2} 

Но попробовать, как я мог, я не могу придумать метод, чтобы удалить «окорок», как это имеет пустое значение в списке.

Заранее спасибо за любые предложения, Frank

информация: Словарь построен со значением по созданию (устанавливается администратором) дополнительное значение добавляется в список с помощью пользовательского ввода. Параметр value используется как выход. Наличие единственного значения в списке приводит к нежелательному результату.

ответ

1

Эта функция рекурсивно проверяет SizedIterable с, чтобы увидеть, если они пусты и возвращает значение False, если он находит один, что является

from collections.abc import Sized, Iterable #If you're on Python >= 3.6, 
              #you can use collections.abc.Collection 

def all_nonempty(v): 
    if isinstance(v, (Sized, Iterable)): 
     return v and (all(map(all_nonempty, v)) if not isinstance(v, str) else True) 
     #We do the check against str because 'a' is a sized iterable that 
     #contains 'a'. I don't think there's an abstract class for 
     #containers like that 
    return True 

Тогда мы можем использовать это, чтобы веять Dict

print({k: v for k, v in d.items() if all_nonempty(v)}) 

выходы :

{'moo': 'cora', 'bye': 2, 'heloo': 1} 
+0

Благодарим вас за этот подход, творит чудеса. –

0

Возможно, как это:

>>> d = {'moo': 'cora', 'ham': ['', 'test'], 'heloo': 1, 'bye': 2} 
>>> {k:v for k,v in d.items() if not(isinstance(v,list) and len(v) > 0 and v[0] == '')} 
{'heloo': 1, 'moo': 'cora', 'bye': 2} 

Или, может быть, просто:

>>> {k:v for k,v in d.items() if not(isinstance(v,list) and '' in v)} 
{'heloo': 1, 'moo': 'cora', 'bye': 2} 

Первый ответ будет удалять элементы, где значения являются списки, в которых элемент первый является ''. Второй будет удалять любое значение, которое представляет собой список, в котором происходит ''.

0

Предполагая, что все значения в списках являются строками:

{k: v 
for k, v in vaar123.items() 
if (not hasattr(v, '__iter__')) or 
    (hasattr(v, '__iter__') and v and all(elem for elem in v))} 

Пояснение: Сохраняйте неизменяемые значения, поскольку они не могут быть пустыми (это не имеет смысла). В противном случае, если значение является итерабельным, отбросьте его, если оно пустое или если оно содержит какие-либо ложные значения (т. Е. Пустая строка в предположении выше).

 Смежные вопросы

  • Нет связанных вопросов^_^