J'ai du mal avec list comprehensions. J'ai besoin d'écrire une fonction qui ajoutera 0 pour chaque nombre N. La fonction ressemble à ceci:

def makeSpace(list, space):
    list = [list.insert(i, 0) for i in list if ....]
    return list

Exemple, je passe makeSpace(list,2) et si ma liste ressemblait à: 1,2,3,4,5,6 alors après que la fonction devrait retourner 1,2,0,3,4,0,5,6,0

Quelqu'un peut-il me dire comment le faire?

PS: Si la boucle est meilleure pour elle, elle peut être traditionnelle for loop J'ai trouvé quelque chose dans une duplicate question et je me suis changé par moi-même:

def fun(lst, space):
    i = space
    while i < len(lst):
        lst.insert(i, 0)
        i += space+ 1
    return lst

Mais il n'ajoute pas de numéro à la fin, par exemple pour tous les 3 espaces: [1, 2, 3, 0, 4, 5, 6] il devrait s'ajouter également après 6 Que dois-je changer?

0
must 12 mars 2019 à 23:07

2 réponses

Meilleure réponse

Voici une version avec une boucle for simple et un compteur indépendant que vous incrémentez:

test = [1, 2, 3, 4, 5, 6]
idx = 1
new = []
for num in test: 
    new.append(num)
    if idx % 3 == 0:
        new.append(0)

    idx += 1 

print(new)
[1, 2, 3, 0, 4, 5, 6, 0]
3
scratchpad 12 mars 2019 à 20:27

Vous pouvez faire quelque chose d'horrible, comme ceci:

>>> n = 2
>>> lst = 1,2,3,4,5,6
>>> [x for i in range(0, len(lst), n) for sub in (lst[i:i+n],(0,)) for x in sub]
[1, 2, 0, 3, 4, 0, 5, 6, 0]

C'est difficile à lire et moins efficace qu'une implémentation naïve utilisant une simple boucle for. Ne l'utilisez pas.

Il est beaucoup mieux d'écrire du code propre et bien organisé plutôt que d'essayer sans raison d'écrire une liste de compréhension. Si la version de compréhension de liste ne semble pas évidente, cela ne vaut certainement pas la peine d'être écrit. Considérez la solution suivante:

>>> def chunk_list_by_n(lst, n):
...     for i in range(0, len(lst), n):
...         yield lst[i:i+n]
...
>>> def foo(lst, n):
...     result = []
...     for chunk in chunk_list_by_n(lst, n):
...         result.extend(chunk)
...         if len(chunk) == n:
...             result.append(0)
...     return result
...
>>> foo((1,2,3,4,5,6),2)
[1, 2, 0, 3, 4, 0, 5, 6, 0]

J'ai utilisé plus de lignes, mais j'ai divisé mon programme en composants réutilisables. Quand je reviendrai et relirai ceci dans un mois, ce sera plus facile à comprendre que cet horrible doublure.

3
juanpa.arrivillaga 13 mars 2019 à 05:12