Problème

J'ai la prochaine liste:

a = (('_a_1', '_a_2'), [0.3, 0.6]) 
b = (('_a_3', '_a_4'), [0.15, 0.56]) 
c = (('_a_5', '_a_6'), [0.22, 0.6])

l = [a, b, c]

Ce que je ne veux pas: choisissez les premiers tuples de la liste et supprimez les _a_ étiquettes. Résultat:

[['1','2'],['3','4'],['5','6']]

Ce que j'ai essayé

Je sais que je peux le faire en utilisant la compréhension de la liste . Mais je ne peux pas le comprendre: D Ce que j'essaye:

[ el.replace('_a_','') for m in l for el in m[0]]

Résultat:

['1', '2', '3', '4', '5', '6']

Je pense qu'il est fermé à la bonne solution. Ajoutez simplement quelque chose comme:

[ [el.replace('_a_','') for m in l] for el in m[0]]

Mais ça ne marche pas ...

3
Mikhail_Sam 16 avril 2018 à 15:18

5 réponses

Meilleure réponse

Vous étiez proche:

a = (('_a_1', '_a_2'), [0.3, 0.6]) 
b = (('_a_3', '_a_4'), [0.15, 0.56]) 
c = (('_a_5', '_a_6'), [0.22, 0.6])

l = [a, b, c]

[ [el.replace('_a_','') for el in tup[0]] for tup in l]
# [['1', '2'], ['3', '4'], ['5', '6']]
1
Thierry Lathuille 16 avril 2018 à 12:22

Voici une façon d'utiliser str.split:

a = (('_a_1', '_a_2'), [0.3, 0.6]) 
b = (('_a_3', '_a_4'), [0.15, 0.56]) 
c = (('_a_5', '_a_6'), [0.22, 0.6])

res = [[i.split('_')[-1], j.split('_')[-1]] for (i, j), k in [a, b, c]]

# [['1', '2'], ['3', '4'], ['5', '6']]

Vous pouvez également utiliser str.replace:

res = [[i.replace('_a_', ''), j.replace('_a_', '')] for (i, j), k in [a, b, c]]

Comme suggéré par @ Ev.Kounis, vous pouvez également écrire ceci fonctionnellement:

res = [list(map(lambda x: x.rsplit('_', 1)[-1], k)) for k, _ in [a, b, c]]

Les compréhensions de listes imbriquées nécessitent une commande spécifique, intuitive pour certains mais pas pour d'autres. Les solutions ci-dessus les évitent complètement.

2
jpp 16 avril 2018 à 12:34
res=[[j.replace("_a_","") for j in i[0]]  for i in l]
#OUT
[['1', '2'], ['3', '4'], ['5', '6']]
0
Roushan 16 avril 2018 à 12:27

Une autre façon de le faire serait d'utiliser la fonction zip:

a = (('_a_1', '_a_2'), [0.3, 0.6]) 
b = (('_a_3', '_a_4'), [0.15, 0.56]) 
c = (('_a_5', '_a_6'), [0.22, 0.6])

l = [[elem[0][-1],elem[1][-1]] for elem in list(zip(a,b,c))[0]]

print(l)

Production:

[['1', '2'], ['3', '4'], ['5', '6']]
0
Vasilis G. 16 avril 2018 à 13:11

Vous pouvez aller avec regex sans le diviser:

import re
pattern=r'[0-9]+'

print([tuple(map(lambda x:re.search(pattern,x).group(),i[0])) for i in l])

Production:

[('1', '2'), ('3', '4'), ('5', '6')]
0
Aaditya Ura 16 avril 2018 à 14:20