2012-12-25 11 views
5

Mam listę obiektów o nazwach foos. Mam pętlę do tworzenia nowej listy.Jak zmapować 2 listy z porównaniem w pythonie

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

Teraz chcę utworzyć nową listę na podstawie lokalizacji.

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

Co chcę wiedzieć, czy jest jakiś sposób, w jaki mogę zrobić coś takiego

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

mogę wykorzystać funkcję mapa tutaj? jeśli tak, to w jaki sposób?

Odpowiedz

7

Oczywiście możesz to zrobić za pomocą funkcji. Można użyć filterbuiltin function:

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

Ale bardziej ogólny i "pythonic" sposobem jest użycie list comprehensions

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

List comprehension wydaje się być to, co chcesz używać:

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

map jest dobre, gdy chcesz zastosować funkcję każdy pozycję na liście (lub dowolny iterable) i otrzymać listę równej długości (lub iterator w Pythonie3) w wyniku. Nie może "pomijać" elementów na podstawie pewnych warunków.

1

mają u związany z filtra z lambda funkcji np

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

jak na przykład ur będzie d

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

wynik powinien być

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

Mam nadzieję, że to może być u spodziewać ...

Powiązane problemy