1
votes

Comment utiliser une condition sur un tableau de dictionnaire pour extraire des éléments d'un autre tableau dans le même dictionnaire?

J'ai un dictionnaire de tableaux.

myarr = [mydict['b'] for num in mydict['a'] num > 35]

Je veux extraire les éléments de mydict ['b'] quand mydict ['a' ] est supérieur à 35 . Je veux

myarr = ['red','blue','green']

J'ai essayé -

mydict={'a':[45,65,78,32], 'b':['red','blue','green','yellow'], 'c':[3.4, 4.5, 6.5, 7.6]}

Je ne veux pas suivre la voie C ++ / C d'énumération et de sauvegarde l'index et en utilisant l'index. Cela ne ressemble pas à Python.

Comment puis-je faire cela?


0 commentaires

5 Réponses :


1
votes

Vous pouvez utiliser enumerate pour accéder à l'index correspondant i à l'aide duquel vous pouvez obtenir la valeur correspondante à partir de mydict ['b'] .

myarr = [mydict['b'][i]  for i, num in enumerate(mydict['a']) if num > 35]
# ['red', 'blue', 'green']


1 commentaires

Je ne veux pas suivre la voie C ++ / C d'énumération et de sauvegarde de l'index et d'utilisation de l'index.



3
votes

vous êtes proche, vous devez utiliser zip :

[b for a, b in zip(mydict['a'], mydict['b']) if a > 35]


0 commentaires

1
votes

Essayez ceci:

[j for i,j in zip(mydict['a'],mydict['b']) if i>35] 


0 commentaires

3
votes

Créez une nouvelle liste si la valeur de dict ['a']> 35 :

1 a
2 b
3 c
4 None
5 None

Python 3 .x :

Utilisation de itertools.zip_longest (* iterables, fillvalue = None) :

De docs :

Créez un itérateur qui regroupe les éléments de chacun des itérables. Si les itérables sont de longueur inégale, les valeurs manquantes sont remplies avec fillvalue. L'itération se poursuit jusqu'à ce que l'itération la plus longue soit épuisé

x = [1,2,3,4,5]    
y = ['a','b','c']

for a,b in zip_longest(x,y):
    print(a,b)

Python 2.x :

Utilisation de itertools.izip_longest (* iterables [ fillvalue])

1 a
2 b
3 c


1 commentaires

Pourriez-vous également ajouter une note sur les différences entre zip et zip_longest ?



1
votes

Si vous êtes prêt à utiliser pandas , ce type de filtrage est assez simple.

Commencez par passer mydict au constructeur DataFrame:

XXX

Utilisez maintenant un masque booléen pour filtrer les colonnes qui répondent à votre condition:

myarr = df[df['a']>35]['b'].values.tolist()
print(myarr)
#['red', 'blue', 'green']

Pour obtenir la sortie souhaitée sous forme de liste, vous pouvez faire:

print(df[df['a']>35])
#    a      b    c
#0  45    red  3.4
#1  65   blue  4.5
#2  78  green  6.5


0 commentaires