4 votes

Vérifiez si le dictionnaire Python contient une valeur et si c'est le cas, retournez la valeur associée

J'ai une liste de dictionnaires, qui contiennent des noms de fichiers et des dates de modification dans le format suivant :

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

J'ai besoin de vérifier si un fileName existe dans le dictionnaire et, si c'est le cas, retourner la valeur de fileMod pour cette entrée.

6voto

Pablo Points 5930

En utilisant une compréhension de liste :

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

3voto

Abhijit Points 24122

Vous pouvez utiliser lambda avec filter.

>>> fileList = [{"fileName": "filename1.typ", "fileMod": "0000000001"}, {"fileName": "filename2.typ", "fileMod": "0000000002"}]
>>> filter(lambda x:x["fileName"]=="filename2.typ",fileList)[0]['fileMod']
'0000000002'

Vous pouvez également le faire en utilisant List-Comprehension

[x['fileMod'] for x in fileList if x["fileName"]=="filename2.typ"][0]

Ou juste une simple itération

for x in fileList:
    if x["fileName"]=="filename2.typ":
        print x["fileMod"]

3voto

Constantinius Points 13708

Juste pour information : votre structure de données est une liste de dictionnaires, pas un dictionnaire. Vous ne pouvez donc pas simplement interroger la liste pour l'élément "fileName". Vous pourriez le faire comme cela :

for filedict in fileList:
    if filedict.get("fileName") == "monfichierdemandé.typ":
        # faire quelque chose
        pass

2voto

Phil Cooper Points 2534

Correct, vous avez mis à jour votre question pour indiquer une liste de dictionnaires comme l'a souligné Janne. Mais maintenant votre déclaration n'est pas vraie :

Je vérifie si le nom du fichier existe en utilisant l'instruction if filename in filelist:, ce qui fonctionne correctement

Ricardo a raison, vous avez besoin d'un dictionnaire de modTimes ou d'un dictionnaire de dictionnaires. Facilement créé à partir de votre fileList avec :

fileList = dict((f['fileName'],f) for f in fileList) 
mod = fileList.get('file1.txt',)
# ou
fileList = dict((f['fileName'],f) for f in fileList)
mod = fileList.get('file1.txt',{}).get('fileMod',)

2voto

juliomalegria Points 6281

Vous pouvez résoudre ce problème de manière élégante en utilisant un générateur et la méthode next :

next(x['fileMod'] for x in fileList if x['fileName'] == 'my filename')

Bien sûr, cela génère une erreur de StopIteration si le générateur est vide (il n'y avait pas de dictionnaire avec fileName == 'my filename' dans votre liste). Vous pouvez éviter l'erreur générée avec :

try:
    next(x['fileMod'] for x in fileList if x['fileName']=='my filename')
except StopIteration:
    print 'Oops! fichier non trouvé'

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