2017-02-22 107 views
-2

Код:python2.7: iteratiing над списком dicts и оценки требуемого значения

import json 
import urllib 
URL = 'www.xyz.com' 
data = json.load(urllib.urlopen(url) 
print data 
[[{"Region":"Europe", "Details":[{"gender":"male", "name":"john", "age":"24", "status":"Ok"}, {"gender":"female", "name":"Rebecca", "age":"22", "status":"None"}], "country":"Germany"}], [{"Region":"Asia", "Details":[{"gender":"male", "name":"kim", "age":"27", "status":"None"}, {"gender":"male", "name":"jen", "age":"22", "status":"None"}], "country":"China"}]] 
# here is what I have tried 
for i in data: 
    for j in i: 
      for key in j.keys(): 
       dicx = j[key] 
       for k in dicx: 
       if isinstance(k, dict) and k['status']=='None': 
       print (i['region'], k['name'])) #I wnant to store this value in a variable rather than printing. 
#this is giving me the following output. 

Europe, Rebecca 
Asia, kim 
Asia, jen 

Сценарий: Из приведенных выше данных, я хочу, чтобы проверить, если во всех «Регион» (ключ), если «статус» (ключ) - «ОК» (значение) или «Нет» (значение), если «статус» (клавиша) «Нет» (значение), тогда он должен вернуть мне детали (значения) этого конкретного «региона» (клавиша) вместе с «именем» (ключ).

например: - желаемый результат (ссылки из приведенных выше данных)

Europe, Rebecca 

Asia, (kim, jen) 

Любая помощь будет оценена.

+0

Я попытался перебрать его с помощью цикла , но я не получаю желаемый результат. Я получаю вывод, подобный этому: Europe, Ребекка Азии, Ким Азии, Джен Я не хочу, выход должен быть повторен (как я использовал циклы для итерации так, как это) Также я не являюсь способный хранить эти значения в переменной. – jamesorc

+0

Добро пожаловать в StackOverflow. Прочтите и следуйте инструкциям по отправке в справочной документации. [Минимальный, полный, проверяемый пример] (http://stackoverflow.com/help/mcve) применим здесь. Мы не можем эффективно помочь вам, пока вы не разместите свой код MCVE и не сможете точно описать проблему. StackOverflow не является кодовым или учебным сервисом. – Prune

+0

@jamesorc - напишите код, который * не работает * к ожиданиям, а также описание (например, ваш комментарий) – wahwahwah

ответ

0

Это очень некрасиво, но может хотеть вы спрашиваете:

matches = [] 
for i in data: # 
       # no changes here 
       if isinstance(k, dict) and k['status']=='None': 
        # print (i[0]['Region'], k['name']) 
        matches.append(([i[0]['Region'], k['name']])) 
from collections import defaultdict 
res = defaultdict(list) 

for k, v in matches: 
    res[k].append(v) 

for k, v in res.iteritems(): 
    if len(v) == 1: 
     print'{}, {}'.format(k, v[0]) 
    else: 
     print '{}, ({})'.format(k, ', '.join(map(str, v))) 

Edit # 1:

... 
for k, v in matches: 
    result[k].append(v) 

mystr = '' 

for k, v in result.iteritems(): 
    if len(v) == 1: 
     mystr += '{}, {}'.format(k, v[0]) 
    else: 
     mystr += ' {}, ({})'.format(k, ', '.join(map(str, v))) 

print type(mystr) 
print mystr 

выход:

<type 'str'> 
Europe, Rebecca Asia, (kim, jen) 

Пример с 3 региона:

<type 'str'> 
Europe, Rebecca America, (David, Ricardo) Asia, (kim, jen) 
+0

Спасибо за ответ. Но приведенный выше код не исправит проблему, он просто возвращает мне все (значения) ключа («имя»). Также оператор задачи должен удерживать вывод в переменной. – jamesorc

+0

Вышеприведенный код возвращает вам * все * ключ значений («имя») -> «john», «Rebecca», «kim», * и * «jen»? Используя 'list'' data' из вопроса, приведенный выше код (когда я запускаю скрипт, используя список данных), выдает указанный желаемый результат, а именно «Ребекка», «Ким» и «Джен». Какие имена вы не хотите в выводе? Каким типом является вывод, который нужно сохранить в переменной, 'str',' list', 'dict', или не важно, просто сохраните его в переменной? Переменная 'res' является' defaultdict () ', которая содержит вывод ->' {'Europe': ['Rebecca'], 'Asia': ['kim', 'jen']} ' – davedwards

+0

Спасибо за решение. После выполнения: 'для k, v в res.iteritems(): if len (v) == 1: print '{}, {}'. Format (k, v [0]) else: print '{}, ({}) '. format (k,', '.join (map (str, v)))' # вывод, который я получаю # '' Европа, Rebecca Asia, ('kim, jen) 'должен храниться в переменная (предпочтительно строка). Обоснование этого - мне нужно снова фильтровать в этом выпуске несколько имен _Ex_ ', если в 'jen' на выходе: # return Asia, kim'.Также вопрос здесь. В приведенных выше json-данных у меня есть 2 региона (списка), что, если я столкнусь с 3 или более регионами (списком) - >> это сработает? – jamesorc