今天,我遇到了dict方法get,它在字典中给定一个键,返回相关的值。

这个函数的用途是什么?如果我想在字典中找到一个与键相关的值,我可以只做dict[key],它返回相同的东西:

dictionary = {"Name": "Harry", "Age": 17}
dictionary["Name"]
dictionary.get("Name")

当前回答

我将给出一个使用python抓取web数据的实际示例,很多时候你会得到没有值的键,在这种情况下,如果你使用dictionary['key'],你会得到错误。Get ('key', ' return_else ')没有问题。

类似地,如果您试图从列表中捕获单个值,我将使用“.join(list)”而不是列表[0]。

希望能有所帮助。

下面是一个实际的例子:

假设,您正在调用一个API,该API返回一个需要解析的JOSN文件。第一个JSON如下所示:

{"bids":{"id":16210506,"submitdate":"2011-10-16 15:53:25","submitdate_f":"10\/16\/2011 at 21:53 CEST","submitdate_f2":"p\u0159ed 2 lety","submitdate_ts":1318794805,"users_id":"2674360","project_id":"1250499"}}

第二个JOSN是这样的:

{"bids":{"id":16210506,"submitdate":"2011-10-16 15:53:25","submitdate_f":"10\/16\/2011 at 21:53 CEST","submitdate_f2":"p\u0159ed 2 lety","users_id":"2674360","project_id":"1250499"}}

请注意,第二个JSON缺少“submitdate_ts”键,这在任何数据结构中都是非常正常的。

因此,当你试图在循环中访问该键的值时,你可以用下面的方法调用它:

for item in API_call:
    submitdate_ts = item["bids"]["submitdate_ts"]

您可以这样做,但它会为第二个JSON行提供一个回溯错误,因为键根本不存在。

正确的编码方式如下:

for item in API_call:
    submitdate_ts = item.get("bids", {'x': None}).get("submitdate_ts")

{'x': None}的存在是为了避免第二级出错。当然,如果您正在进行抓取,您可以在代码中构建更多的容错性。比如首先指定一个if条件

其他回答

在Python 3.8及以后版本中,字典get()方法可以与赋值表达式中的walrus操作符:=一起使用,以进一步减少代码:

if (name := dictonary.get("Name")) is not None
    return name

使用[]而不是get()将需要将代码包装在try/except块中并捕获KeyError(未显示)。如果没有walrus操作符,您将需要另一行代码:

name = dictionary.get("Name")
if (name is not None)
    return name

这个函数的用途是什么?

一个特别的用法是用字典计数。让我们假设您想要计算给定列表中每个元素的出现次数。常见的方法是创建一个字典,其中键是元素,值是出现的次数。

fruits = ['apple', 'banana', 'peach', 'apple', 'pear']
d = {}
for fruit in fruits:
    if fruit not in d:
        d[fruit] = 0
    d[fruit] += 1

使用.get()方法,你可以使这段代码更紧凑和清晰:

for fruit in fruits:
    d[fruit] = d.get(fruit, 0) + 1

另一个我没有看到提到的用例是作为sort, max和min等函数的key参数。get方法允许根据它们的值返回键。

>>> ages = {"Harry": 17, "Lucy": 16, "Charlie": 18}
>>> print(sorted(ages, key=ages.get))
['Lucy', 'Harry', 'Charlie']
>>> print(max(ages, key=ages.get))
Charlie
>>> print(min(ages, key=ages.get))
Lucy

感谢对不同问题的回答提供了这个用例!

它允许你在缺少键时提供一个默认值:

dictionary.get("bogus", default_value)

返回default_value(不管你选择它是什么),而

dictionary["bogus"]

会引发一个KeyError。

如果省略,default_value为None,这样

dictionary.get("bogus")  # <-- No default specified -- defaults to None

返回None

dictionary.get("bogus", None)

会。

这样做的目的是,如果没有找到键,您可以给出一个默认值,这非常有用

dictionary.get("Name",'harry')