2012-12-25 2 views
5

Ho una lista di oggetti di dire foos. Ho un ciclo per creare una nuova lista.Come mappare 2 liste con confronto in python

foo1 = {id:1,location:2}
per es. foos = [foo1,foo2,foo3]

Ora voglio creare un nuovo elenco in base alla posizione.

new_list = [] 
for foo in foos: 
    if foo.location==2: 
     new_list.append(foo) 

Quello che voglio sapere c'è un modo in cui posso fare qualcosa di simile

new_list = [] 
new_list = map(if foo.location ==2,foos) // this is wrong code but is something like this possible. ? 

Posso usare la funzione mappa qui? se sì come?

risposta

7

Certo che si può fare con la funzione. È possibile utilizzare il filterbuiltin function:

new_list = filter(lambda foo: foo.location == 2, foos) 

Ma la più generale e il modo "divinatorio" è quello di utilizzare list comprehensions

new_list = [foo for foo in foos if foo.location == 2] 
6

List comprehension sembra essere ciò che si desidera utilizzare:

new_list = [foo for foo in foos if foo.location == 2] 

map è buono quando si vuole applicare una funzione di ogni elemento in un elenco (o qualsiasi iterable) e ottenere un elenco di uguale lunghezza (o un iteratore in Python3) come risultato. Non può "saltare" elementi in base ad alcune condizioni.

1

U hanno legato con filtro con lambda funzione per esempio,

a = {'x': 1, 'location': 1} 
b = {'y': 2, 'location': 2} 
c = {'z': 3, 'location': 2} 
d=[a,b,c] 

come da esempio d sarà

d = [{'x': 1, 'location': 1}, {'y': 2, 'location': 2}, {'z': 3, 'location': 2}] 
output = filter(lambda s:s['location']==2,d)' 
print output' 

risultato dovrebbe essere,

[{'y': 2, 'location': 2}, {'z': 3, 'location': 2}] 

Spero che questo può essere u ... aspetta