2017-07-27 1 views
0

Je voudrais savoir s'il est possible de le remplacer:Si la condition sur les éléments de la liste dans la compréhension de la liste

results = [x for x in os.listdir(dir_path) if os.path.splitext(x)[1] == ".tif" and "abc" in os.path.splitext(x)[0]] 

avec quelque chose comme:

results = [x for x in os.listdir(dir_path) if ext == ".tif" and "abc" in name for ext, name in os.path.splitext(x)] 

Merci pour l'aide

+1

Qu'est-ce que '' abc '' dans le nom d'ext, nom dans os.path.splitext (x) 'supposé vouloir dire? qu'est-ce que vous essayez d'accomplir ici? –

+0

Voulez-vous dire: '[x pour x dans os.listdir (dir_path) si ext ==" .tif "et" abc "dans os.path.splitext (x) [1]]' ??? –

+0

@ juanpa.arrivillaga oui merci, je voulais dire l'inverse. Et "abc" est juste un nom arbitraire. J'essaye de lister tous les fichiers qui ont "abc" dans le nom de fichier et en même temps ont l'extension ".tif" – MMagician

Répondre

1

Vous pouvez définir name et ext en utilisant une expression de générateur interne:

results = [x for x, name, ext in ((x, *os.path.splitext(x)) for x in os.listdir(dir_path)) 
      if ext == ".tif" and "abc" in name] 

Ici, *os.path.splitext(x) dépaquète résultat de cet appel aux variables name et ext dans la compréhension de la liste externe (uniquement dans Python 3). Pour les versions plus anciennes, vous pouvez utiliser (x,) + os.path.splitext(x) à la place. Notez également que splitext renverra un tuple (name, ext), pas (ext, name). Sinon, au lieu d'utiliser splitext, vérifiez simplement le nom de fichier directement, en supposant que la partie que vous voulez trouver dans la partie nom ne peut pas apparaître dans la partie extension du nom de fichier.

results = [x for x in os.listdir(dir_path) if x.endswith(".tif") and "abc" in x] 
3

Votre ligne est assez long, vous pourriez vouloir le diviser en plusieurs lignes. Vous pouvez envelopper votre condition dans une fonction:

def filter_file(path): 
    ext, name = os.path.splitext(path) 
    if not ext == '.tif': 
     return False 
    return 'abc' in name 

Et puis utilisez

results = [x for x in os.listdir(dir_path) if filter_file(x)] 
+0

Bien sûr, ceci pourrait fonctionner aussi. – MMagician

1

Je suppose que c'est ce que vous voulez:

results = [name + ext for name, ext in [os.path.splitext(x) for x in os.listdir(dir_path)] if ext == ".tif" and "abc" in name ] 

Note: Je l'ai placé name avant ext.

Et la liste interne génère une liste de tuples qui est le nom et la valeur ext.