2014-09-02 4 views
1

Je veux chercher un tableau si elle contient une variable « Foo »Trouvez variable spécifique dans le tableau intérieur tableau

details={u'firstName': u'Test', u'activeSubscriptions': [{u'productCode': u'BBB', u'name': u'Bar'}, {u'productCode': u'FFF', u'name': u'Foo'} 

Je l'ai fait comme ceci:

subscriptions_name = data['activeSubscriptions'][0]['name'] 

mais cela ne fonctionne que pour la premières données dans le tableau.

Comment puis-je obtenir le nom de FFF si les données ne sont pas placées de manière cohérente?

+0

-t-il être 'FFF' ou souhaitez-vous vérifier la valeur de' name' pour tous '' dicts' dans activeSubscriptions'? –

+0

Ce doit être "FFF". –

+0

Notez que ce n'est pas un tableau mais un 'dict'. – wRAR

Répondre

1

Si vous êtes à la recherche par productCode dans votre tableau activeSubscriptions, vous recherchez ceci:

>>> details={'firstName': 'Test', 'activeSubscriptions': [{'productCode': 'BBB', 'name': 'Bar'}, {'productCode': 'FFF', 'name': 'Foo'}]} 
>>> product_code_search_key = 'FFF' 
>>> for subscription in details['activeSubscriptions']:   
...  if subscription and subscription.get('productCode','') and subscription['productCode'] == product_code_search_key: 
...   print subscription['name'] 
...   break 
... 
>>> Foo 
0

Vous pouvez aplatir votre liste récursive et la recherche à l'intérieur:

def flatten(l): 
    res = [] 
    for e in l: 
     if type(e) is dict: 
      tmp = e.values() 
      res += flatten(tmp) 
     elif type(e) is list: 
      tmp = e[:] 
      res += flatten(tmp) 
     else: 
      res += e 
    return res 

if "Foo" in flatten(list) 

Edit: pour des raisons de performance, il est inutile de calculer le tableau et la recherche à l'intérieur. Après une version qui recherche juste à l'intérieur du tableau:

def is_in_superlist(l, m): 
    for e in l: 
     if type(e) is dict: 
      return is_in_superlist(e.values(), m) 
     elif type(e) is list: 
      return is_in_superlist(e, m) 
     else: 
      if e == m: 
       return True 
    return False 

is_in_superlist(list, "Foo")    
0

vous pouvez itérer le tableau de dictonary et atteind comme ci-dessous

details={'firstName': 'Test', 'activeSubscriptions': [{'productCode': 'BBB', 'name': 'Bar'}, {'productCode': 'FFF', 'name': 'Foo'}]} 

for i in details['activeSubscriptions']:   
    if 'Foo' in i.values(): 
     print i 
Questions connexes