遍历一个函数

时间:2019-08-17 02:35:56

标签: python json python-3.x string api

我正在努力找出循环遍历函数的最佳方法。这个API的输出是一个Graph Connection,我有点不喜欢这个元素。我确实需要从api输出中获取ID,并将它们以字典或某种形式传递给另一个API调用。

****请注意,原始输出是图形连接。...print(type(api_response)确实将其显示为列表,但是如果我执行print(type(api_response [0] ))返回

这是api调用的原始输出:

[{'_ from':无,'至':{'id':'5c9941fcdd2eeb6a6787916e','type':'user'}},{'_from':无,'to':{'id': '5cc9055fcc5781152ca6eeb8','type':'user'}},{'_from':None,'to':{'id':'5d1cf102c94c052cf1bfb3cc','type':'user'}}}]

这是我到目前为止的代码.....

api_response = api_instance.graph_user_group_members_list(group_id, content_type, accept,limit=limit, skip=skip, x_org_id=x_org_id)


def extract_id(result):
    result = str(result).split(' ')
    for i, r in enumerate(result):
        if 'id' in r:
            id = (result[i+1].translate(str.maketrans('', '', string.punctuation)))
            print( id )
            return id

extract_id(api_response)


def extract_id(result):
    result = str(result).split(' ')
    for i, r in enumerate(result):
        if 'id' in r:
            id = (result[i+8].translate(str.maketrans('', '', string.punctuation)))
            print( id )
            return id

extract_id(api_response)

def extract_id(result):
    result = str(result).split(' ')
    for i, r in enumerate(result):
        if 'id' in r:
            id = (result[i+15].translate(str.maketrans('', '', string.punctuation)))
            print( id )
            return id

extract_id(api_response)

我已经能够使用函数来提取ID,但是我是通过字符串来完成的。我需要一个可伸缩的解决方案,可以将这些ID传递给另一个API调用。

我尝试使用for循环,但是因为它是1个字符串并且i + 1定义了id的位置,所以它是多余的,并且仅多次输出id的1。

我使用这些功能中的每一个都接收到正确的输出,但是,它不是可伸缩的.....,但这不是解决方案。请帮助指导我...

1 个答案:

答案 0 :(得分:0)

因此,为了解决作为字符串问题的响应,我建议使用python的builtin json module。具体来说,方法.loads()可以将字符串转换为字典或字典列表。您可以从那里遍历列表或字典,并检查密钥是否等于'id'。这是一个基于您说的响应示例的示例。

import json

s = "[{'_from': None, 'to': {'id': '5c9941fcdd2eeb6a6787916e', 'type': 'user'}}, {'_from': None, 'to': {'id': '5cc9055fcc5781152ca6eeb8', 'type': 'user'}}, {'_from': None, 'to': {'id': '5d1cf102c94c052cf1bfb3cc', 'type': 'user'}}]"

# json uses double quotes and null; there is probably a better way to do this though
s = s.replace("\'", '\"').replace('None', 'null') 

response = json.loads(s)  # list of dicts

for d in response:
    for key, value in d['to'].items():
        if key == 'id':
            print(value)  # or whatever else you want to do

            # 5c9941fcdd2eeb6a6787916e
            # 5cc9055fcc5781152ca6eeb8
            # 5d1cf102c94c052cf1bfb3cc