2017-09-26 2 views
-3

J'ai besoin de cette fonction pour retourner la somme des éléments situés aux indices impairs. Et c'est ce que j'ai en ce moment:comment seulement additionner une partie d'éléments dans une liste

def getSumOdds(aList): 
    for element in aList: 
     if element % 2 == 1: 
+0

Bienvenue à SO. Malheureusement, ce n'est pas un groupe d'étude, un forum de discussion ou un service de rédaction de code. S'il vous plaît, prenez le temps de lire [ask] et les liens qui y sont référencés. – wwii

+0

Lorsque vous envoyez du code ou des données, merci de nous contacter - https://stackoverflow.com/editing-help#comment-formatting – wwii

+0

Qui a voté en faveur de la fermeture parce que c'est trop large? Ce vote peut être mal placé.Il y a quelques façons de le faire, vrai - cependant, la manière la plus pythonienne utilise la fonction 'sum' intégrée, ainsi qu'un générateur en tandem avec' enumerate'. – jrd1

Répondre

1

En utilisant le code que vous avez déjà commencé, enumerate est probablement la fonction que vous voulez qui renvoie le nombre et les valeurs dans la liste. Ensuite, nous filtrons les indices impairs et les ajoutons à une variable pour la somme, comme vous l'avez déjà fait:

def getSumOdds(aList): 
    total = 0 
    for index, element in enumerate(aList): 
     if index % 2 == 1: 
      total += element 
    return total 

l = [1, 2, 3, 4, 5, 6, 7, 8, 9] 

print getSumOdds(l) # 20 (odd indices: 2+4+6+8=20) 
0

Juste vous pouvez utiliser une tranche de liste list[1::2] ou la fonction

def getSumOdds(aList): 
    return sum(aList[1::2]) 
2

puisque vous faites for element in aList, element % 2 == 1 vérifiera si chaque élément est impair , pas si son index est impair.

Ce que vous pouvez faire est la suivante:

value = 0 
for index in range(len(aList)): 
    if index % 2 == 1: 
     value += aList[value] 

Cela passe par tous les indices , et si elle est ajoute étrange, l'élément à cet indice à l'accumulateur.

Cette méthode est assez facile à comprendre; cependant, il passe par un nombre inutile d'éléments:

value = 0 
for index in range(1, len(aList), 2): 
    value += aList[index] 

range(x, y, z) génère tous les éléments de comptage de x jusqu'à l'exclusion des y, en comptant par z. Cela commence à 1 et prend tous les 2 éléments.

C'est assez long cependant, et peut être raccourci à ce qui suit:

value = sum(aList[index] for index in range(1, len(aList), 2)) 

En utilisant le découpage de la liste, où aList[start:end:jump] donne tous les jump -ième élément à partir de start jusqu'à end (implicitement la fin), vous pouvez effectuer les opérations suivantes:

value = sum(aList[1::2]) 

Ceci totalise tous les deux éléments en commençant par le premier.

Si votre entrée est pas nécessairement indexable (qui est, il est itérable, mais ne peut pas utiliser [index] la syntaxe, comme un ensemble, plage, carte, etc.), vous pouvez le faire:

value = sum(val for index, val in enumerate(anIter) if index % 2 == 1) 

Cela résume toutes les valeurs où l'index est impair en obtenant l'index et la valeur pour chaque valeur énumérée. La fonction enumerate est une itérable qui renvoie (0, a[0]), (1, a[1]), ..., (len(a) - 1, a[-1]).

+0

Remarque: Vous pouvez gérer des types itératifs arbitraires (éventuellement non indexables) [avec 'itertools.islice'] (https://docs.python.org/3/library/itertools.html#itertools.islice) et éviter les calculs d'index . 'sum (itertools.islice (anIter, 1, None, 2))' et vous n'avez pas besoin de suivre les index du tout (et la suppression des valeurs inutilisées est gérée efficacement au niveau C pour démarrer). Donc, vraiment, les deux seules solutions qui valent la peine d'être examinées en termes de rapidité et de concision sont les approches par tranches et «islice»; le premier est plus rapide mais la séquence seulement, le dernier est plus lent mais gère toutes les itérations. – ShadowRanger

+0

@ShadowRanger Cool, merci pour les informations supplémentaires! – HyperNeutrino