【问题标题】:python2.7 : iteratiing over list of dicts and evaluating the required value [closed]python2.7:迭代字典列表并评估所需的值[关闭]
【发布时间】:2017-07-13 05:34:54
【问题描述】:

代码:

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

场景:根据上面的数据,我想检查所有“区域”(键)是否“状态”(键)是“Ok”(值)或“None”(值),如果“状态”( key) 是“None”(value) 那么它应该返回我那个特定“Region”(key) 的详细信息(value) 以及“name”(key)。

例如:- 期望的输出(参考上述数据)

Europe, Rebecca

Asia, (kim, jen)

任何帮助将不胜感激。

【问题讨论】:

  • 我尝试使用循环对其进行迭代,但没有得到所需的输出。我得到与此类似的输出:Europe, Rebecca Asia, Kim Asia, Jen 我不想重复输出(因为我使用循环来迭代所以它是这样的)而且我无法将这些值存储到一个变量。
  • 欢迎来到 StackOverflow。请阅读并遵循帮助文档中的发布指南。 Minimal, complete, verifiable example 适用于此。在您发布 MCVE 代码并准确描述问题之前,我们无法有效地帮助您。 StackOverflow 不是编码或教程服务。
  • @jamesorc - 请将不起作用的代码发布到期望值和描述(如您的评论)
  • 抱歉不完整部分,更新了上面的部分。
  • made in javascript你可以看看逻辑转换成python

标签: python json api parsing


【解决方案1】:

这很丑陋,但可能确实需要你问:

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)))

编辑#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)

【讨论】:

  • 感谢您的回复。但是上面的代码并没有解决这个问题,它只是返回了 key ("name") 的所有(值)。问题陈述还需要将输出保存在变量中。
  • 上面的代码返回所有键值键(“name”)->“john”、“Rebecca”、“kim”、 “仁”?使用来自问题的listdata 上面的代码(当我使用数据列表运行脚本时),会产生规定的所需输出,即“Rebecca”、“kim”和“jen”。您在输出中想要哪些名称?输出要存储在变量中是什么类型,一个strlistdict,或者不重要,只存储在一个变量中?变量res 是一个defaultdict(&lt;type 'list'&gt;),它保存输出 -> {'Europe': ['Rebecca'], 'Asia': ['kim', 'jen']}
  • 感谢您的解决方案。执行后:for k, v in res.iteritems(): if len(v) == 1: print'{}, {}'.format(k, v[0]) else: print '{}, ({})'.format(k, ', '.join(map(str, v)))' # the output which I gain# ``Europe, Rebecca Asia, ('kim, jen) 应该存储在一个变量(最好是字符串)中,这背后的基本原理是我需要在这个输出中再次过滤几个名称 Ex if in 'jen' in output: # return Asia , kim。这里还有一个问题,在上面的 json 数据中,我有 2 个区域(列表)如果遇到 3 个或更多区域(列表)怎么办 ->> 这会解决吗?
  • @jamesorc 请查看更新后的答案。我已经用 3 个区域测试了代码,并将该输出包含在内以供您查看和考虑。
  • 很好,非常感谢您的帮助。@downshift
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-05
  • 2018-03-22
  • 2018-09-21
  • 2023-04-06
  • 2022-01-19
相关资源
最近更新 更多