2012-07-11 8 views
19

Duplicar posible:
Get difference from two lists in PythonRetire la lista de la lista en Python

¿Cuál es una forma simplificada de hacer esto? Lo he intentado solo, y no puedo resolverlo. lista ay lista b, la nueva lista debe tener elementos que están solo en la lista a. Entonces:

a = apple, carrot, lemon 
b = pineapple, apple, tomato 
new_list = carrot, lemon 

He intentado escribir código, pero siempre me devuelve toda la lista a.

Respuesta

5

¿Esto funcionaría para usted?

a = ["apple", "carrot", "lemon"] 
b = ["pineapple", "apple", "tomato"] 

new_list = [] 
for v in a: 
    if v not in b: 
     new_list.append(v) 

print new_list 

O, más concisamente:

new_list = filter(lambda v: v not in b, a) 
21

Usted puede escribir esta usando un list comprehension que nos dice literalmente que los elementos tienen que terminar en new_list:

a = ['apple', 'carrot', 'lemon'] 
b = ['pineapple', 'apple', 'tomato'] 

# This gives us: new_list = ['carrot' , 'lemon'] 
new_list = [fruit for fruit in a if fruit not in b] 

O, usando a para bucle:

new_list = [] 
for fruit in a: 
    if fruit not in b: 
     new_list.append(fruit) 

Como puede ver, estos enfoques son bastante similares y es por eso que Python también tiene listas de comprensión para construir fácilmente listas.

3

Es posible que desee esto:

a = ["apple", "carrot", "lemon"] 
b = ["pineapple", "apple", "tomato"] 

new_list = [x for x in a if (x not in b)] 

print new_list 
13

Se puede utilizar un set:

# Assume a, b are Python lists 

# Create sets of a,b 
setA = set(a) 
setB = set(b) 

# Get new set with elements that are only in a but not in b 
onlyInA = setA.difference(b) 

ACTUALIZACIÓN
Como iurisilvio y mgilson señalado, este enfoque sólo funciona si a y b hacer no contiene duplicados, y si el orden de los elementos no importa.

+0

supongo que este es el camino a seguir, pero cambia la lista si se ha duplicado cuerdas. – iurisilvio

+1

@iurisilvio: Tienes razón. Este enfoque solo funciona si 'a' y' b' solo contienen entradas únicas. En ese caso, tendría aún más sentido utilizar un 'conjunto' para' a', 'b' de todos modos. Pero este es probablemente el enfoque más rápido. –

+0

Tampoco funciona si el orden de los elementos es importante, pero podría no ser el caso aquí (+1 de mí) – mgilson

2

¿Qué tal el uso de sets (o el construido en set ya que Sets estaba en desuso en 2.6)?

from sets import Set 
a = Set(['apple', 'carrot', 'lemon']) 
b = Set(['pineapple','apple','tomato']) 
new_set = a.difference(b) 
print new_set 

da la salida

Set(['carrot', 'lemon']) 
+0

¿Por qué no utilizar el conjunto integrado 'set'? – mgilson

+0

Lo obtuve del ejemplo en [documentos de python] (http://docs.python.org/library/sets.html#sets.Set) pero no estoy seguro de por qué lo hicieron de esa manera, ¿alguna idea? – StuGrey

+0

'sets' está en desuso desde Python v2.6 (ver http://docs.python.org/library/sets.html) –

Cuestiones relacionadas