我如何从python中的这个列表中获取特定元素?

时间:2017-06-29 13:30:26

标签: python api azure

我正在使用Microsoft Azure face API,我想只获得眼镜响应。 继承我的代码:

########### Python 3.6 #############
import http.client, urllib.request, urllib.parse, urllib.error, base64, requests, json

###############################################
#### Update or verify the following values. ###
###############################################

# Replace the subscription_key string value with your valid subscription key.
subscription_key = '(MY SUBSCRIPTION KEY)'

# Replace or verify the region.
#
# You must use the same region in your REST API call as you used to obtain your subscription keys.
# For example, if you obtained your subscription keys from the westus region, replace 
# "westcentralus" in the URI below with "westus".
#
# NOTE: Free trial subscription keys are generated in the westcentralus region, so if you are using
# a free trial subscription key, you should not need to change this region.
uri_base = 'https://westcentralus.api.cognitive.microsoft.com'

# Request headers.
headers = {
    'Content-Type': 'application/json',
    'Ocp-Apim-Subscription-Key': subscription_key,
}

# Request parameters.
params = {
    'returnFaceAttributes': 'glasses',
}

# Body. The URL of a JPEG image to analyze.
body = {'url': 'https://upload.wikimedia.org/wikipedia/commons/c/c3/RH_Louise_Lillian_Gish.jpg'}

try:
    # Execute the REST API call and get the response.
    response = requests.request('POST', uri_base + '/face/v1.0/detect', json=body, data=None, headers= headers, params=params)

    print ('Response:')
    parsed = json.loads(response.text)
    info = (json.dumps(parsed, sort_keys=True, indent=2))
    print(info)

except Exception as e:
    print('Error:')
    print(e)

并返回如下列表:

[
  {
    "faceAttributes": {
      "glasses": "NoGlasses"
    },
    "faceId": "0f0a985e-8998-4c01-93b6-8ef4bb565cf6",
    "faceRectangle": {
      "height": 162,
      "left": 177,
      "top": 131,
      "width": 162
    }
  }
]

我只想要眼镜属性,所以它只会返回“眼镜”或“NoGlasses” 感谢您提前提供任何帮助!

4 个答案:

答案 0 :(得分:1)

我认为你正在打印整个响应,当你真的要向下钻取并获取其中的元素时。试试这个:

print(info[0]["faceAttributes"]["glasses"])

我不确定API是如何工作的,所以我不知道你指定的params实际上在做什么,但这应该适用于此。

编辑:感谢@Nuageux注意到这确实是一个数组,你必须指定第一个对象是你想要的那个。

答案 1 :(得分:0)

我想你可以在该列表中获得一些元素,所以你可以这样做:

{ 
    title: "★", 
    width: "50px", 
    template: '<a class="btn btn-primary k-grid-custom-btn search-btn details-small-btn"></a>' 
}

答案 2 :(得分:0)

你有没有尝试过:
def f(grp): #define a list to collect valid start and end ranges d=[] ( #append a new row if the start date is at least 2 days greater than the last date from previous row, #otherwise update last rows's end date with current row's end date. grp.reset_index(drop=True) .apply(lambda x: d.append({x.start_date:x.end_date}) if x.name==0 or (x.start_date-pd.DateOffset(1))>grp.iloc[x.name-1].end_date else d[-1].update({list(d[-1].keys())[0]:x.end_date}), axis=1) ) #reconstruct a df using only valid start and end dates pairs. return pd.DataFrame([[list(e.keys())[0],list(e.values())[0]] for e in d], columns=['start_date','end_date']) df.groupby('id').apply(f).reset_index().drop('level_1',1) Out[467]: id start_date end_date 0 1 2017-01-01 2017-02-03 1 1 2017-02-05 2017-02-14 2 1 2017-02-16 2017-02-28 3 2 2017-01-01 2017-01-19 4 2 2017-01-24 2017-02-20

答案 3 :(得分:0)

这看起来更像是字典而不是列表。字典使用{key:value}语法定义,并且可以通过其键的值来引用。在您的代码中,您有faceAttributes作为键,其中包含另一个字典,其中键glasses会导致您想要的最后一个值。

您的info对象是一个包含一个元素的列表:一个字典。因此,为了获得该字典中的值,您需要告诉列表所在的列表(在列表的头部,所以信息[0])。

所以你的参考语法是:

#If you want to store it in a variable, like glass_var
glass_var = info[0]["faceAttributes"]["glasses"] 
#Or if you want to print it directly
print(info[0]["faceAttributes"]["glasses"])

这里发生了什么? info [0]是包含多个键的字典,包括faceAttributesfaceIdfaceRectanglefaceRectanglefaceAttributes本身都是带有更多键的词典,您可以参考这些词来获取它们的值。

您打印的树上显示了词典的所有键和值,因此您可以使用正确的键引用词典的任何部分:

print(info["faceId"]) #prints "0f0a985e-8998-4c01-93b6-8ef4bb565cf6"
print(info["faceRectangle"]["left"]) #prints 177
print(info["faceRectangle"]["width"]) #prints 162

如果您的信息列表中有多个条目,那么您将拥有多个词典,并且您可以获得所有输出:

for entry in info: #Note: "entry" is just a variable name, 
                   #  this can be any name you want. Every 
                   #  iteration of entry is one of the 
                   #  dictionaries in info.
    print(entry["faceAttributes"]["glasses"])

编辑:我没有看到该信息是一个字典列表,适合于这个事实。