2017-08-03 1 views
3

J'ai deux listesRemplacement des valeurs NULL dans une liste avec des valeurs d'une autre liste

lis1 = [12,34,56,89] 
lis2 = [10,34,90,108,None,None,None,None] 

Comment puis-je remplacer les valeurs None avec des valeurs de lis1 sans créer une nouvelle liste?

Le résultat final devrait être

lis2 = [10,34,90,108,12,34,56,89] 

Jusqu'à présent, ce que j'ai essayé

lis2 = [i for j in lis2 for i in lis1 if j is None] 

Mais cela me donne une liste incorrecte.

Répondre

2

est ici une approche possible:

In [870]: lis2[lis2.index(None):] = lis1 

In [871]: lis2 
Out[871]: [10, 34, 90, 108, 12, 34, 56, 89] 

affectation de sous-tranche. L'hypothèse ici est que lis2 a autant de None valeurs que lis1 a des éléments et qu'ils se trouvent tous à la fin.


Pour le briser:

  1. lis2.index(None) renvoie le premier indice de None dans la liste

    In [873]: lis2.index(None) 
    Out[873]: 4 
    
  2. Vous pouvez obtenir une sous-tranche de lis1 comme ceci:

    In [874]: lis2[lis2.index(None):] 
    Out[874]: [None, None, None, None] 
    
  3. Réaffectez simplement lis2 à cette tranche.

+0

@COLDSPEED Pouvez-vous m'expliquer la première ligne de votre code? –

+0

@SouvikRay Édité ma réponse avec explication. –

+2

@coldspeed Qu'est-ce que 'None' est mélangé dans lis2? – voidpro

1

Voici un moyen.

> lis1 = [12,34,56,89] 
> lis2 = [10,34,90,108,None,None,None,None] 
> lis2 = [x for x in lis2 if x is not None] 
> lis2 
=> [10, 34, 90, 108] 
> lis2 += lis1 
> lis2 
=> [10, 34, 90, 108, 12, 34, 56, 89] 

d'abord enlever tous les None de lis2. Puis étendre lis2 avec lis1

+1

Cela ne supprime aucun élément de 'lis2'.Il crée simplement une nouvelle liste et l'affecte à la variable 'lis2'. –

+0

@PaulRooney c'est bien. 'lis2' serait réaffecté avec de nouvelles valeurs. – voidpro

+0

Ou si l'espace mémoire n'est pas un problème, même cela pourrait être accepté. –

1

(expansion sur la réponse de COLDSPEED, ce qui est plus propre si tous les Nones viennent à la fin de la liste.)

# Replace Nones in list 2 with elements from list 1 
> lis1 = [2, 3, 6, 8] 
> lis2 = [1, None, None, 4, 5, None, 7, None] 

# Index of next element to use from list 1 
> j = 0 

> for i in range(len(lis2)): 
    if lis2[i] == None: 
     lis2[i] = lis1[j] # Replace a None with something from list 1 
     j += 1 # Use the following element next time 

> lis2 
[1, 2, 3, 4, 5, 6, 7, 8] 

Encore une fois, vous devrez faire quelques vérifications si elle est pas garanti que la longueur de la liste 1 est le même que le nombre de None s dans la liste 2.

+0

Que faire si le nombre de 'None' dans' lis2' est plus grand que le nombre d'éléments dans 'lis1'? – voidpro

+0

Vous obtiendrez une erreur 'list index out of range'. Si vous vouliez vous assurer que cela ne se produisait pas, vous pouviez "sortir" de la boucle une fois 'j == len (lis1)'. –

1

Un chemin plus court:

lis2 = [1, None, None, 4, 5, None, 7, None] 
lis1 = [2, 3, 6, 8] 
list2 =[i if i else lis1.pop(0) for i in lis2] 
print(list2) 

Sortie:

[1, 2, 3, 4, 5, 6, 7, 8]