Données d'entrée: J'ai lu de nombreuses réponses où ont été suggérées d'utiliser la notation de tranche avec le premier élément incluant . Mais dans mon cas, je devrais prendre chaque 3ème élément de la liste. P> est-il possible d'améliorer ma réalisation? P> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] Code>
Données de sortie: [1, 2, 6, 4, 5, 12, 7, 8, 18, 10] Code>
for index in range(len(data)):
if (index + 1) % 3 == 0:
data[index] = data[index] * 2
6 Réponses :
Oui, vous pouvez le faire avec la notation de la tranche:
data[2::3] = [x*2 for x in data[2::3]]
Vous pouvez améliorer cela en faisant data [2 :: 3] = (x * 2 pour x en données [2 :: 3]) code>. Cela utilise un générateur et évite la création d'une liste temporaire.
@Tomkarzes mais data [2 :: 3] code> est une liste temporaire. Pour éviter vraiment la création d'une liste temporaire, il faut utiliser
data [2 :: 3] = (x * 2 pour x dans itertools.lice (données, 2, aucune, 3)) code>.
@blhsing Oh, bon point. Je ne faisais que regarder la liste temporaire "extérieure". Je suppose que vous pouvez aussi faire des données
En fait, affectation de la liste des tranches sera matérialiser le générateur sur une liste de toute façon, comme j'ai appris de Le dernier commentaire sur Cette réponse
Il existe un paramètre "étape" sur la plage code> Itérateur: serait-ce que cela fait? p> p>
Votre solution n'est pas trop mauvaise. Il peut être amélioré en itérant simplement sur les indices désirés directement, plutôt que d'itération de tous les indices et de sauter ceux que vous ne voulez pas:
[1, 2, 6, 4, 5, 12, 7, 8, 18, 10]
Vous pouvez l'organiser un peu en passant un troisième argument à la fonction de plage (), comme celui-ci: P>
pour index dans la plage (2, len (données), 3):
Data [index] = Data [index] * 2 code> p>
Vous pouvez utiliser le cycle d'iTERTOOLS et ZIP pour associer des éléments avec leurs multiplicateurs: ou, vous pouvez utiliser énumérer () p>
... et le gagnant est:
import time def question_by_akrapovich(data): for index in range(len(data)): if (index + 1) % 3 == 0: data[index] = data[index] * 2 return data def answer_by_Tom_Karzes_and_Prune(data): for index in range(2, len(data), 3): data[index] *= 2 return data def answer_by_Blorgbeard(data): data[2::3] = [x*2 for x in data[2::3]] return data def answer_1_by_Alain_T(data): from itertools import cycle return [n * m for n, m in zip(data, cycle([1, 1, 2]))] def answer_2_by_Alain_T(data): return [ n*max(1,i%3) for i,n in enumerate(data) ] def answer_2_by_Manuel_Montoya(data): for index in range(2, len(data), 3): data[index] = data[index]*2 return data def test(f): n = 10_000_000 data = [i + 1 for i in range(n)] start_time = time.perf_counter() data = f(data) run_time = time.perf_counter() - start_time if n != len(data): print('error in list length', n, len(data)) exit(1) for i in range(n): j = i + 1 m = j * 2 if j % 3 == 0 else j if data[i] != m: print('error in data', i, m, data[i]) exit(1) print('%.3f %s' % (run_time, f.__name__)) print('Calculation time in seconds and results validation test.') for f in [question_by_akrapovich, answer_by_Tom_Karzes_and_Prune, answer_2_by_Manuel_Montoya, answer_by_Blorgbeard, answer_1_by_Alain_T, answer_2_by_Alain_T]: test(f)
Dupliqué possible de Python - Multipliez tous les autres éléments d'une liste