140 votes

Un moyen efficace de supprimer les clés contenant des chaînes vides d'un dict.

J'ai un dict et je voudrais supprimer toutes les clés pour lesquelles il y a des chaînes de valeurs vides.

metadata = {u'Composite:PreviewImage': u'(Binary data 101973 bytes)',
            u'EXIF:CFAPattern2': u''}

Quelle est la meilleure façon de procéder ?

0voto

jeschwar Points 842

Voici une option si vous utilisez pandas :

import pandas as pd

d = dict.fromkeys(['a', 'b', 'c', 'd'])
d['b'] = 'not null'
d['c'] = ''  # empty string

print(d)

# convert `dict` to `Series` and replace any blank strings with `None`;
# use the `.dropna()` method and
# then convert back to a `dict`
d_ = pd.Series(d).replace('', None).dropna().to_dict()

print(d_)

0voto

dheeraj .A Points 549

Certaines des méthodes mentionnées ci-dessus ignorent s'il existe des entiers et des flottants avec les valeurs 0 et 0.0.

Si quelqu'un veut éviter ce qui précède, il peut utiliser le code ci-dessous (supprime les chaînes vides et les valeurs None des dictionnaires et listes imbriqués) :

def remove_empty_from_dict(d):
    if type(d) is dict:
        _temp = {}
        for k,v in d.items():
            if v == None or v == "":
                pass
            elif type(v) is int or type(v) is float:
                _temp[k] = remove_empty_from_dict(v)
            elif (v or remove_empty_from_dict(v)):
                _temp[k] = remove_empty_from_dict(v)
        return _temp
    elif type(d) is list:
        return [remove_empty_from_dict(v) for v in d if( (str(v).strip() or str(remove_empty_from_dict(v)).strip()) and (v != None or remove_empty_from_dict(v) != None))]
    else:
        return d

0voto

MADHUR GUPTA Points 193
metadata ={'src':'1921','dest':'1337','email':'','movile':''}
ot = {k: v for k, v in metadata.items() if v != ''}
print(f"Final {ot}")

-2voto

Richard Mathie Points 77

Un peu de benchmarking :

1. Compréhension de la liste recréer le dict

In [7]: %%timeit dic = {str(i):i for i in xrange(10)}; dic['10'] = None; dic['5'] = None
   ...: dic = {k: v for k, v in dic.items() if v is not None} 
   1000000 loops, best of 7: 375 ns per loop

2. Compréhension de la liste recréer le dict en utilisant dict()

In [8]: %%timeit dic = {str(i):i for i in xrange(10)}; dic['10'] = None; dic['5'] = None
   ...: dic = dict((k, v) for k, v in dic.items() if v is not None)
1000000 loops, best of 7: 681 ns per loop

3. Boucle et suppression de la clé si v est None

In [10]: %%timeit dic = {str(i):i for i in xrange(10)}; dic['10'] = None; dic['5'] = None
    ...: for k, v in dic.items():
    ...:   if v is None:
    ...:     del dic[k]
    ...: 
10000000 loops, best of 7: 160 ns per loop

Ainsi, la boucle et l'effacement sont les plus rapides à 160ns, la compréhension de liste est deux fois plus lente à ~375ns et avec un appel à dict() est deux fois moins lent, soit ~680ns.

Enrouler 3 dans une fonction ramène le temps à environ 275ns. De plus, pour moi, PyPy était environ deux fois plus rapide que neet python.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X