3 votes

Comment remplacer un élément d'une liste par une chaîne vide en fonction d'une autre liste imbriquée de même longueur basée sur une condition ?

J'ai une liste d'en-têtes comme ci-dessous :

h_list = ['h1','h2','h3','h4','h5']

J'ai maintenant une liste de données (imbriquée) :

d_list = [
[1, None, 3, ' ', 5],
[1, ' ', 2, ' ', 9]
]

Les deux listes sont toujours de la même longueur, je veux donc faire une correspondance dans chaque liste de la liste imbriquée à la même position d'index et si toutes les valeurs correspondantes sont soit None o ' ' puis remplacez l'élément de h_list a ' ' (Chaîne vide)

Le résultat attendu est le suivant :

h_list = ['h1',' ','h3',' ','h5']

4voto

Ann Zen Points 18513

Essayez une liste de compréhension :

h_list = ['h1','h2','h3','h4','h5']

d_list = [
[1, None, 3, ' ', 5],
[1, ' ', 2, ' ', 9]
]

empty = [' ', None]
h_list = [' ' if any(b[i] in empty for b in d_list) else v for i, v in enumerate(h_list)]
print(h_list)

Sortie :

['h1', ' ', 'h3', ' ', 'h5']

Décomposition de cette partie du code :

h_list = [' ' if any(b[i] in empty for b in d_list) else v for i, v in enumerate(h_list)]

Tout d'abord, nous n'avons que

[(i, v) for i, v in enumerate(h_list)]

Il s'agit d'une liste des indices et des valeurs de chaque élément de la rubrique h_list .

Maintenant, nous utilisons un if pour déterminer quand ajouter le ' ' . Tout d'abord, nous devons reconnaître la any() fonction :

any(b[i] in empty for b in d_list)

retours True si tous des tableaux à l'intérieur de d_list à l'index i est dans la empty liste. Nous voulons None y ' ' soit en place pour toutes les chaînes de la rubrique h_list que son index renvoie un ' ' o None pour n'importe quelle liste dans d_list , donc :

[' ' for i, v in enumerate(h_list) if any(b[i] in empty for b in d_list)]

Enfin, nous voulons utiliser la chaîne originale si no any(b[i] in empty for b in d_list) . Pour cela, nous utilisons un else déclaration (il est à noter qu'avec un else les déclarations sont déplacées vers le côté gauche de l'écran d'affichage. for boucle.) :

h_list = [' ' if any(b[i] in empty for b in d_list) else v for i, v in enumerate(h_list)]

2voto

GACy20 Points 113

Je pense que cela devrait fonctionner pour vos exemples :

new_list = []
for orig_element, *values in zip(h_list, *d_list):
    new_list.append(orig_element if any(not (v is None or str(v).strip() == '') for v in values) else '')

Si vous souhaitez modifier la liste sur place, il vous suffit de le faire :

for i, (orig_element, *values) in enumerate(h_list, *d_list):
    h_list[i] = orig_element if any(not (v is None or str(v).strip() == '') for v in values) else ''

1voto

Ajax1234 Points 42210

Vous pouvez utiliser zip con all :

h_list = ['h1','h2','h3','h4','h5']
d_list = [[1, None, 3, ' ', 5], [1, ' ', 2, ' ', 9]]
r = [' ' if all(k in {None, ' '} for k in j) else a for a, j in zip(h_list, zip(*d_list))]

Sortie :

['h1', ' ', 'h3', ' ', 'h5']

0voto

ombk Points 1910

Solution de base

h_list = ['h1','h2','h3','h4','h5']
d_list = [
[1, None, 3, ' ', 5],
[1, ' ', 2, ' ', 9]
]
# loop over d_list
for i in d_list:
# loop over inner list 
    for k in i:
# if type not int, give me space in that index
        if type(k)!=int:
            h_list[i.index(k)]=" "
h_list

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X