2010-01-25 3 views
1

J'ai une liste de 16 éléments [a00, a01, a02, ..., a15] et j'aimerais calculer une liste [b0, b1, b2 , b3, b4, b5, b6, b7] oùpython: traitement d'une liste de 16 éléments en une liste de 8 éléments

b0 = a00*256+a01 
b1 = a02*256+a03 
b2 = a04*256+a05 
(etc.) 

quelle est la manière la plus facile de le faire? (Je suis un débutant en python)

+0

Si une question dont la réponse est « la compréhension de la liste » est le plus commun à propos de Python, la seconde plus commune est "comment est-ce que je divise une séquence en morceaux"? Cette question fait les deux! Voir, par exemple. http://stackoverflow.com/questions/2095637 – telliott99

Répondre

2

Vous pouvez faire une liste de compréhension ...

a = [a00, a01,.... ] 
#Readed, take a list with 0,2,4... len(a) [15, will stop at 14] 
# then make a[i]*256 + a[i+1], so 
# a[0]*256+a[1], a[2]*256+a[3], ... a[14]*256+a[15] 
b = [ a[i]*256+a[i+1] for i in range(0,len(a),2) ] 
+0

Semble que tout le monde est rapide ... et ont les mêmes idées :-D – Khelben

+0

Juste curieux, pourquoi cela apparaît comme le plus ancien lorsque les temps post suggèrent le contraire? – danben

+0

@Adam Bernier: Ah, je ne savais pas que les modifications comptaient. Bien que, au moment où j'ai posté ce commentaire, la réponse MAK n'avait pas été éditée et montrait également le même comportement – danben

4

b_list = [a_list[2*i] * 256 + a_list[2*i+1] for i in range(8)]

Notez que cela ne fonctionne que si un a 16 éléments.

Une solution plus générale serait:

b_list = [a_list[2*i] * 256 + a_list[2*i+1] for i in range(len(a_list)/2)]

aussi longtemps que a_list a un nombre pair d'éléments.

+1

oh. j'ai compris. ne veux-tu pas dire [a_list [2 * i] * 256 + a_list [2 * i + 1] pour i dans la gamme (8)] –

+0

pour i dans la gamme (len (a_list)/2) fonctionne pour toutes les combinaisons paires;) – fijter

+0

@Jason S - oui, c'est ce que je voulais dire :) Correction. – danben

1

La première chose qui vient à l'esprit:

>>> a=range(16) 
>>> b=[a[i]*256+a[i+1] for i in range(0,len(a),+2)] 
[1, 515, 1029, 1543, 2057, 2571, 3085, 3599] 
+0

La version n'a pas été spécifiée dans la question de l'OP, mais xrange ne fonctionnerait pas sur Python 3. –

+0

xrange est spécifique à des versions particulières? hmmm .... –

+0

Oui, 'range' dans python 3 fonctionnera comme' xrange' dans Python 2. Le "vieux" 'range', créant une liste complète disparaît dans Python 3, si vous voulez créer une liste vous ' ll doit faire: 'list (range)' – Khelben

2
lst = [a01, a02, ... ] 
result = [256 * a + b for a, b in zip(lst[::2], lst[1::2])] 

Cela évite l'utilisation unpythonic de range.

+0

Pouvez-vous expliquer :: dans ce contexte? – danben

+0

Ce sont des syntaxes de tranche. Ça commence: fin: pas. Les indices négatifs comptent à la fin de la liste. Tout élément omis correspond à 0: -1: 1. Donc, :: 2 retournera tous les autres éléments de la liste. – recursive

4

ne pas trop Golfy, mais si vous voulez éviter l'enfer indice, vous pouvez utiliser cet idiome zip pratique:

a = range(16) 
b = [x*256+y for x,y in zip(*[iter(a)]*2)] 
+0

comment ça marche? (confus) J'ai regardé http://docs.python.org/library/functions.html#zip et j'ai compris les bases mais ce truc * et iter est bizarre. –

+0

Il crée une liste de deux itérateurs sur un. L'astérisque signifie que les éléments de la liste suivante doivent être utilisés comme paramètres pour l'appel de la fonction. Donc, deux itérateurs identiques sont utilisés comme arguments pour le zip. Ainsi, chaque itérateur ne fait que remplacer les éléments de la liste. – recursive

+0

@Jason oui c'est un idiome rusé, mais je trouve qu'il est très pratique. récursif est la plupart du temps juste dans son explication, mais je dois vous recommander à travers le code pour vraiment le comprendre, j'ai été également confondu dès la première fois, et j'ai trouvé qu'il était très enrichissant d'y aller. – Triptych

Questions connexes