2017-07-25 1 views
1

J'ai 2 listes:Une compréhension de la liste avec deux « Fors » et un « si » état

>>> phrases = ['emp_sal','emp_addr'] 
>>> cols = ['emp_sal_total','emp_sal_monthly','emp_addr_primary','emp_ssn','emp_phone'] 

Je suis en train d'utiliser la compréhension de la liste et filtrer Col. telle que seules les valeurs Col. devrait être choisi qui ont une phrase emp_sal ou emp_addr en eux.

Ainsi, la production devrait être:

['emp_sal_total','emp_sal_monthly','emp_addr_primary'] 

Ceci est juste un exemple fictif reproduisant le scénario. Exemple réel a une cols liste de 180 colonnes impaires.

Essayé ci-dessous solution:

new_cols = [c for c in cols if p for p in phrases in c] 

Il échoue avec:

Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
TypeError: 'in <string>' requires string as left operand, not list 

Ci-dessous approche donne une liste vide:

>>> [c for c in cols if p in c for p in phrases] 
    [] 
+0

Je pense que vous voulez '[c pour c pour p dans Col. phrases si p en c]' – Hamms

+0

Cela fonctionne bien. était un peu proche .. :) –

Répondre

5

Vous devez tester si une chaîne de phrases est dans la colonne actuelle, votre itération sur cols. Pour cela, utilisez any():

[c for c in cols if any(c.startswith(p) for p in phrases)] 

Le problème avec votre méthode est que vous essayez d'utiliser p avant qu'il ne soit défini, ce qui soulève une NameError:

>>> [c for c in cols if p in c for p in phrases] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'p' is not defined 

Comme il est indiqué dans les commentaires par @ Hamms, vous pouvez toujours utiliser quelque chose de similaire à votre méthode. Vous avez juste besoin d'avoir défini p avant d'essayer de l'utiliser:

>>> [c for c in cols for p in phrases if p in c] 
['emp_sal_total', 'emp_sal_monthly', 'emp_addr_primary'] 
>>>