2013-02-01 2 views
0

J'ai une liste de listes dans le format suivantFiltrage d'une liste de listes de manière intelligente

a = [[1,...,255],[1,...,255],...,[1,...,255]] 

-à-dire une liste de longueur arbitraire contenant des listes d'entiers de longueur fixe 255. (Les valeurs de la Les listes de longueurs fixes sont des données du "monde réel", et non des entiers 1 à 255 comme dans cet exemple.)

Maintenant, je voudrais filtrer toutes les valeurs dans toutes les listes internes (de longueur 255), le réglage à 0 si leurs valeurs sont supérieures à un certain seuil.

Existe-t-il une manière intelligente de faire ceci sans devoir écrire deux pour des boucles?

+1

Pouvez-vous sur ce que vous signifie «filtrer». N'est-il pas vrai que si vous trouvez une valeur dans une liste imbriquée au-dessus d'une certaine valeur, cette sous-liste est mise à zéro? ou est-ce la somme() d'une liste interne. – sotapme

+0

Il veut le mettre à zéro. –

Répondre

4

Vous pouvez utiliser numpy faire très facilement:

import numpy as np 

a = [range(255) for _ in range(10)] 
np_a = np.array(a)  
# set all values above 200 to 0 
np_a[np_a > 200] = 0 
# np_a now contains the data with all values above 200 changed to 0 

# if you needed to convert the numpy array back to a python list 
a = np_a.tolist() 

sortie pour montrer fonctionner.

In [209]: np_a 
Out[209]: 
array([[ 0, 1, 2, ..., 252, 253, 254], 
     [ 0, 1, 2, ..., 252, 253, 254], 
     [ 0, 1, 2, ..., 252, 253, 254], 
     ..., 
     [ 0, 1, 2, ..., 252, 253, 254], 
     [ 0, 1, 2, ..., 252, 253, 254], 
     [ 0, 1, 2, ..., 252, 253, 254]]) 

In [210]: np_a[np_a > 252] = 0 

In [211]: np_a 
Out[211]: 
array([[ 0, 1, 2, ..., 252, 0, 0], 
     [ 0, 1, 2, ..., 252, 0, 0], 
     [ 0, 1, 2, ..., 252, 0, 0], 
     ..., 
     [ 0, 1, 2, ..., 252, 0, 0], 
     [ 0, 1, 2, ..., 252, 0, 0], 
     [ 0, 1, 2, ..., 252, 0, 0]]) 
+0

J'ai juste essayé, mais 'npa' n'est pas défini. Je suis intéressé à voir des résultats. – sotapme

+0

@sotapme - c'est une faute de frappe, essayez avec 'np_a' – root

+0

Belle solution. C'est comme ça que tu le voudrais. – sotapme

0

Variante 1: Seulement 1 for, par exemple:

dst = [] 
for s in src: 
    dst.append([x if x < 3 else 0 for x in s]) 

Variante 2: Sans explicite for:

filter = lambda lst: [x if x < 3 else 0 for x in lst] 
dst = [filter(x) for x in src] 
+0

comment est la compréhension de la liste pour une boucle for? –

+0

@ MattiLyra désolé, pas sûr de comprendre votre question. Voulez-vous dire que la compréhension de la liste est implicite si "pour" cycle? –

+0

Oui, la compréhension de liste est pour les boucles, c'est juste syntaxiquement plus agréable. http://docs.python.org/2/tutorial/datastructures.html#list-comprehensions –

0
# arbitarry length list of 255 length lists.  
l = [range(255)]*3 # 3 inner lists (as example) 

# get filtered results: 
f = [[k if k > 5 else 0 for k in j] for j in l] # filter at value 5 (as example) 

# as a function: 
def filter(lst, num): 
    return [[k if k > num else 0 for k in j] for j in lst] 

# as an iter over inner lists. 
def filter(lst, num): 
    for j in lst: 
     yield [k if k > num else 0 for k in j] 
Questions connexes