【问题标题】:Why does my pandas list contain duplicates?为什么我的熊猫列表包含重复项?
【发布时间】:2022-01-21 20:30:09
【问题描述】:

我有一个函数,它接受api_response 并测试是否满足条件if "meta" not in api_response:。如果满足条件,我从响应中提取键/对值percent_complete 并将其打印到控制台。该值是一个百分比,并且在api_response 中只出现一次。

我的问题是,当它打印到控制台时,列表(应该包含 1x 值,例如 0.19)会打印两次该值。

例如,如果percent_complete == 0.19,控制台将打印Your data requested, associated with ID: 2219040 is (0.19, 0.19) complete!

我的代码有什么问题,可能是导致这种情况的原因吗?

功能 -

def api_call():

#   Calling function that returns API authentication details for use in endpoint_initializer()
    key, secret, url = ini_reader()
#   Calling function that makes initial API POST call and returns endpoint_url to call, until data is returned.  
    endpoint_url = endpoint_initializer()
    
#   saving current date in a variable, for use when printing user message
    date = dt.datetime.today().strftime("%Y-%m-%d")
#   Printing endpoint_url and current date.
    print("-------------------------------------\n","API URL constructed for:", date, "\n-------------------------------------")
    print("-------------------------------------------------------------\n","Endpoint:", endpoint_url, "\n-------------------------------------------------------------")

#   Loop will continously call the end_point URL until data is returned. When data is not returned the `percent_complete' key value is extracted from api response.
#   this will inform user of status of data aggregation.
    while True:
        response = requests.get(url = endpoint_url, auth = HTTPBasicAuth(key, secret), headers = {"Vendor-firm": "343"})
        api_response = json.loads(response.text)
#       Test condition to see if "meta" is in api_response. Meta only in response, when data is ready.
        if "meta" not in api_response:
            id_value = "id"
            res1 = [val[id_value] for key, val in api_response.items() if id_value in val]
            id_value = "".join(res1)
            percent_value = "percent_complete"
            res2 = (tuple(api_response["data"]["attributes"].get("percent_complete", '') for key, val in api_response.items()))
            print(f' Your data requested, associated with ID: {id_value} is {res2} complete!')
            time.sleep(5)
#       Condition to allow API response to be returned, if condition is not met.
        elif "meta" in api_response:
            return api_response

示例 API 响应 -

{
    "data": {
        "id": "2219040",
        "type": "jobs",
        "attributes": {
            "job_type": "PORTFOLIO_VIEW_RESULTS",
            "started_at": "2021-12-18T17:40:17Z",
            "parameters": {
                "end_date": "2021-12-14",
                "output_type": "json",
                "view_id": 304078,
                "portfolio_id": 1,
                "portfolio_type": "firm",
                "start_date": "2021-12-14"
            },
            "percent_complete": 0.19,
            "status": "In Progress"
        },
        "relationships": {
            "creator": {
                "links": {
                    "self": "/v1/jobs/2219040/relationships/creator",
                    "related": "/v1/jobs/2219040/creator"
                },
                "data": {
                    "type": "users",
                    "id": "731221"
                }
            }
        },
        "links": {
            "self": "/v1/jobs/2219040"
        }
    },
    "included": []
}

【问题讨论】:

    标签: python list loops


    【解决方案1】:

    您回复中的字典包含两项(“数据”和“包含”)。您创建 res2 的代码会遍历所有项目:

                res2 = (tuple(api_response["data"]["attributes"].get("percent_complete", '') for key, val in api_response.items()))
    

    所以你得到了两次信息。由于您只是从“数据”键中提取数据,因此迭代这些项目是愚蠢的。正确的?做吧:

                res2 = api_response["data"]["attributes"].get("percent_complete", '') 
    

    【讨论】:

      猜你喜欢
      • 2018-11-16
      • 2020-06-16
      • 1970-01-01
      • 1970-01-01
      • 2014-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      相关资源
      最近更新 更多