2015-08-29 1 views
1

J'essaie d'apprendre python en développant des outils CLI pour mon travail.Vérifiez si un élément de liste Python contient une chaîne dans une autre liste

J'ai deux listes de domaines, l'un «dédupliqué» contient les domaines complets que j'ai chargés à partir d'un fichier texte, l'autre «poison» contient certaines chaînes correspondant partiellement à certains domaines.

deduplicated = ['facebook.com','google.com','en.wikipedia.org','youtube.com','it.wikipedia.org'] 

poison = ['youtube','wikipedia'] 

Je suis en train de faire correspondre la liste des chaînes afin d'obtenir deux nouvelles listes, une « propres » (les domaines qui ne sont pas couvertes par la liste de poison) « poison » et un « sale » (qui ont été partiellement appariés »)

C'est ma tentative, mais cela ne fonctionne pas ...

clean = [] 

dirty = [] 

for item in deduplicated: 
    if (any(poison in word for word in deduplicated)): 
    print ("useless domain %s" % item) 
    dirty.append(item) 
else: 
    print ("nice domain %s" % item) 
    clean.append(item) 

Mise à jour.

Modifié le code car le formatage était moche.

Pour référence ultérieure, l'erreur que je recevais était:

TypeError: 'in ' requires string as left operand, not list

+0

Quelle est votre sortie et quel est votre sortie désirée? – mikeb

+0

@mikeb J'ai mis à jour la question avec l'erreur que je recevais. –

Répondre

5

Depuis la boucle extérieure boucles déjà sur deduplicated, vous devez la boucle intérieure en boucle sur poison:

if any(search in item for search in poison): 
    print("Useless domain", item) 
+0

merci cela a fonctionné parfaitement! –

0

Si je vous avez eu raison, ce que vous vouliez faire était:

dirty = [word for word in deduplicated if any(unwanted in word for unwanted in poison)] 
clean = [word for word in deduplicated if word not in dirty] 

print(dirty) # => ['en.wikipedia.org', 'youtube.com', 'it.wikipedia.org'] 
print(clean) # => ['facebook.com', 'google.com'] 

Il y a deux problèmes de l'homme avec votre code en ce moment:

  • Vous itérer sur item s, mais vous ne les utilisez pas dans le contrôle
  • Votre empreinte est foiré. Python est sensible aux espaces blancs
+0

Vous avez raison à propos de l'itération! L'indentation était mon incapacité à formater correctement le code dans l'éditeur Stackoverflow! J'utilise Sublime Text et gère assez bien l'indentation. –

+0

@Downvoter, pourriez-vous expliquer? – ndn