3
votes

False ne doit pas être traité comme 0

Je dois parcourir une liste contenant des valeurs aléatoires comme

for i in range(len(array)):
        if array[i] ==0 and array[i] is not False:
            array.append(array[i])
            array.remove(array[i])

  return array

et déplacer tous les zéros (0) à la fin de la liste en préservant l'ordre des autres éléments. Voici mon code:

["a",0,0,"b",None,"c","d",0,1,False,0,1,0,3,[],0,1,9,0,0,{},0,0,9]

Le code fonctionne bien mais il traite «False» comme 0 pour que la sortie ne corresponde pas à celle souhaitée. J'ai essayé de rechercher la réponse et je les ai implémentés dans mon code comme en utilisant «est» et «n'est pas», mais ils ne semblent pas fonctionner pour moi. Que puis-je faire d'autre?

Ma sortie: ['a', 'b', None, 'c', 'd', 1, 1, 3, [], 1, 9 , {}, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] cependant la sortie doit être ['a', 'b', None , 'c', 'd', 1, Faux, 1, 3, [], 1, 9, {}, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]


10 commentaires

Vous ne devriez pas utiliser is pour comparer avec 0. Mais ce n'est pas le seul problème ici.


J'ai utilisé '==' au départ mais j'ai eu le même problème, donc je l'ai changé en 'est'


Eh bien, ne changez pas les choses au hasard. Utilisez is pour comparer avec Vrai et Faux, et == pour comparer avec des entiers.


Pour être complet, nous devons mentionner que is peut également être utilisé correctement pour comparer avec None .


@RoryDaulton terminé


'la sortie ne correspond pas à celle souhaitée'. Pourriez-vous publier votre sortie réelle?


@DanielRoseman Est-ce que l'utilisation de est pour comparer avec 0 (et spécifiquement 0) vraiment un problème ici? Au moins tous les petits nombres ne devraient-ils pas vraiment être le même objet? D'accord pour le cas général de int , cependant.


Non, comme je l'ai dit, ce n'est pas le seul problème, il y a des problèmes beaucoup plus graves avec le code. Mais comme OP est clairement un apprenant, il est bon de bien faire les choses dès le départ.


@DanielRoseman D'accord, mais dans ce cas particulier, l'utilisation de is 0 ne serait pas réellement un moyen valide de s'assurer que c'est 0 et non False , à condition que le "détail de mise en œuvre" des petits nombres mis en commun soit vrai? Bien sûr, avec un avertissement sévère w.r.t. le cas général?


@ 10 juillet à droite. Terminé.


5 Réponses :


5
votes

Il existe de nombreuses façons de déplacer les zéros à la fin du tableau. Voici une façon d'itérer sur la liste (si nécessaire) et d'éviter toute fonctionnalité avancée de Python. Notez que cela utilise un tableau temporaire, car c'est une très mauvaise idée de réorganiser les éléments d'une liste pendant que vous la parcourez .

['a', 'b', None, 'c', 'd', 1, False, 1, 3, [], 1, 9, {}, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

Cela donne le impression

array = ["a",0,0,"b",None,"c","d",0,1,False,0,1,0,3,[],0,1,9,0,0,{},0,0,9]

newarray = []
for item in array:
    if item != 0 or item is False:
        newarray.append(item)
while len(newarray) < len(array):
    newarray.append(0)
array = newarray

print(array)

Si vous voulez comprendre pourquoi Python traite False comme égal à 0 , vous devez comprendre que False et True sont des membres du type bool , qui est un sous-type de int . En d'autres termes, False vaut vraiment 0 mais avec un type spécial. C'est généralement une excellente idée, mais vous avez trouvé un cas où cela complique les choses.


0 commentaires

2
votes

Solution utilisant le filtre

Veuillez voir la solution ci-dessous, elle essaie de séparer les éléments non-zéro et zéro tout en prenant soin de l'exigence False.

Input List = ['a', 0, 0, 'b', None, 'c', 'd', 0, 1, False, 0, 1, 0, 3, [], 0, 1, 9, 0, 0, {}, 0, 0, 9]
Non Zero Elements List with Order = ['a', 'b', None, 'c', 'd', 1, False, 1, 3, [], 1, 9, {}, 9]
Zero Elements List = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Result List = ['a', 'b', None, 'c', 'd', 1, False, 1, 3, [], 1, 9, {}, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]


0 commentaires

0
votes
array = ["a",0,0,"b",None,"c","d",0,1,False,0,1,0,3,[],0,1,9,0,0,{},0,0,9]

for i in range(len(array)):
    if type(array[i]) is bool:
        if array[i] is False:
            array[i] = 'False'
        else:
            array[i] = 'True'
    elif array[i] is 0:
        array.append(array[i])
        array.remove(array[i])

print(array)
This may not be the exact solution. However it may help you to detect the boolean and show it as 'False' or 'True' in terms of string in the list.

0 commentaires

0
votes

Il y a deux problèmes avec votre code, et aucun d'entre eux n'a rien à voir avec la façon dont vous comparez avec 0 dans votre vérification if . En effet, array [i] == 0 et array [i] n'est pas False et le array [i] is 0 plus court fonctionnerait, bien que ce dernier devrait être géré avec soin; cela fonctionne dans votre cas et avec la version actuelle de Python, mais ne fonctionnera pas pour de plus grands nombres et pourrait ne pas fonctionner avec 0 dans d'autres versions (voir ici pour les détails).

Les problèmes réels sont:

  • Au fur et à mesure que vous modifiez la boucle tout en l'itérant, vous pouvez manquer des éléments, car vous supprimez le i e élément, puis passez au i + 1 th, mais le L'ancien élément i + 1 ème est maintenant le i ème, donc vous sautez cela. Ce problème est en quelque sorte contré par le deuxième problème.
  • Lorsque vous exécutez array.remove (array [i]) , vous supprimez le premier élément du tableau qui est égal à array [i] < / code>, c'est-à-dire égal à 0 . Cela inclut False , donc lorsque vous frappez le premier 0 après le False , vous supprimez le False à la place, et lorsque vous appuyez sur le 0 suivant, vous supprimez le 0 avant cela, et ainsi de suite.

Comme déjà noté dans d'autres réponses, la meilleure façon de résoudre ce problème serait de créer un nouveau tableau, soit avec une boucle explicite, soit avec une compréhension de liste ou un filtre .


0 commentaires

0
votes
['a', 0, 0, 'b', None, 'c', 'd', 0, 1, False, 0, 1, 0, 3, [], 0, 1, 9, 0, 0, {}, 0, 0, 9]
['a', 'b', None, 'c', 'd', 1, False, 1, 3, [], 1, 9, {}, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

0 commentaires