2014-07-10 2 views
0

J'ai une liste de dict ce que certaines données, et je voudrais extraire certaines paires clé: valeur dans une nouvelle liste de dicts. Je sais qu'un moyen que je pourrais faire ceci serait d'utiliser del i['unwantedKey'], cependant, je préfère ne pas supprimer des données, mais plutôt créer une nouvelle dict avec les données nécessaires.Extraire une clé multiple: paires de valeurs d'un dict à un nouveau dict

L'ordre des colonnes peut changer, j'ai donc besoin de quelque chose pour extraire les deux paires clé/valeur du dict plus grand dans un nouveau dict.

Format Données actuelles

[{'Speciality': 'Math', 'Name': 'Matt', 'Location': 'Miami'}, 
{'Speciality': 'Science', 'Name': 'Ben', 'Location': 'Las Vegas'}, 
{'Speciality': 'Language Arts', 'Name': 'Sarah', 'Location': 'Washington DC'}, 
{'Speciality': 'Spanish', 'Name': 'Tom', 'Location': 'Denver'}, 
{'Speciality': 'Chemistry', 'Name': 'Jim', 'Location': 'Dallas'}] 

code pour supprimer la clé: la valeur de dict

import csv 

data= [] 
for line in csv.DictReader(open('data.csv')): 
    data.append(line) 

for i in data: 
    del i['Speciality'] 

print data 

désiré Format des données sans utiliser del i['Speciality']

[{'Name': 'Matt', 'Location': 'Miami'}, 
{'Name': 'Ben', 'Location': 'Las Vegas'}, 
{'Name': 'Sarah', 'Location': 'Washington DC'}, 
{'Name': 'Tom', 'Location': 'Denver'}, 
{'Name': 'Jim', 'Location': 'Dallas'}] 
+0

Dosez votre code de travail? – emeth

+0

Oui mon code fonctionne, mais il supprime le dictionnaire indésirable, et je ne veux pas supprimer les données. Au lieu de cela je cherchais une option pour extraire les données que je veux dans un nouveau dict, laissant l'ancienne dict inchangée. –

Répondre

1

Si vous voulez donner une liste positive des clés de copier dans le nouveaux dictionnaires:

import csv 

with open('data.csv', 'rb') as csv_file: 
    data = list(csv.DictReader(csv_file)) 

keys = ['Name', 'Location'] 
new_data = [dict((k, d[k]) for k in keys) for d in data] 

print new_data 
0

supposons que nous avons,

l1 = [{'Location': 'Miami', 'Name': 'Matt', 'Speciality': 'Math'}, 
     {'Location': 'Las Vegas', 'Name': 'Ben', 'Speciality': 'Science'}, 
     {'Location': 'Washington DC', 'Name': 'Sarah', 'Speciality': 'Language Arts'}, 
     {'Location': 'Denver', 'Name': 'Tom', 'Speciality': 'Spanish'}, 
     {'Location': 'Dallas', 'Name': 'Jim', 'Speciality': 'Chemistry'}] 

pour créer une nouvelle liste de dictionnaires qui ne contiennent pas les notions de spécialité "clés que nous pouvons faire,

l2 = [] 
for oldd in l1: 
    newd = {} 
    for k,v in oldd.items(): 
     if k != 'Speciality': 
      newd[k] = v 
    l2.append(newd) 

et maintenant I2 sera votre sortie désirée. En général, vous pouvez exclure une liste arbitraire de clés comme si

exclude_keys = ['Speciality', 'Name'] 
l2 = [] 
    for oldd in l1: 
     newd = {} 
     for k,v in oldd.items(): 
      if k not in exclude_keys: 
       newd[k] = v 
     l2.append(newd) 

la même chose peut être fait avec une include_keys variables

include_keys = ['Name', 'Location'] 
l2 = [] 
    for oldd in l1: 
     newd = {} 
     for k,v in oldd.items(): 
      if k in include_keys: 
       newd[k] = v 
     l2.append(newd) 
+0

mes données réelles sont plus complexes que cet exemple simple. Au lieu de créer une nouvelle liste de dictionnaires qui NE contiennent PAS de 'Spécialité', comment puis-je créer une nouvelle liste de dictionnaires qui contiennent 'Nom' et 'Emplacement'? –

+0

haha, à droite ou vous pourriez utiliser des listes imbriquées. – Gabriel

0

vous pouvez créer une nouvelle liste de dicts limitées aux touches que vous voulez avec une ligne de code (Python 2.6+):

NLoD=[{k:d[k] for k in ('Name', 'Location')} for d in LoD] 

Essayez:

>>> LoD=[{'Speciality': 'Math', 'Name': 'Matt', 'Location': 'Miami'}, 
{'Speciality': 'Science', 'Name': 'Ben', 'Location': 'Las Vegas'}, 
{'Speciality': 'Language Arts', 'Name': 'Sarah', 'Location': 'Washington DC'}, 
{'Speciality': 'Spanish', 'Name': 'Tom', 'Location': 'Denver'}, 
{'Speciality': 'Chemistry', 'Name': 'Jim', 'Location': 'Dallas'}] 
>>> [{k:d[k] for k in ('Name', 'Location')} for d in LoD] 
[{'Name': 'Matt', 'Location': 'Miami'}, {'Name': 'Ben', 'Location': 'Las Vegas'}, {'Name': 'Sarah', 'Location': 'Washington DC'}, {'Name': 'Tom', 'Location': 'Denver'}, {'Name': 'Jim', 'Location': 'Dallas'}] 

Puisque vous utilisez csv, vous pouvez limiter les colonnes que vous avez lu en premier lieu les colonnes souhaitées afin que vous n'avez pas besoin de supprimer les données indésirables:

dc=('Name', 'Location')   
with open(fn) as f: 
    reader=csv.DictReader(f) 
    LoD=[{k:row[k] for k in dc} for row in reader] 
Questions connexes