【问题标题】:How can I add multiple keys to a python Dictionary?如何将多个键添加到 python 字典?
【发布时间】:2017-04-10 01:04:20
【问题描述】:

我有一个抓取信息并将其保存到数据库的网络爬虫。我使用以下代码来保存数据。

try: 
    base['vevo']['url']
except:
    base['vevo']['url'] = "NotGiven"
try: 
    base['vevo']['viewsLastWeek']['data']['time']
except:
    base['vevo']['viewsLastWeek']['data']['time'] = '2199-01-01'

现在这通常可以正常工作,但有时数据流根本不会为base['vevo'] 返回任何信息。这打破了上面的 dict add 并说 KeyError 'vevo'.

我一直在浏览其他 stackoverflow 问题,但我找不到任何引用一次添加多个键的内容,就像我正在尝试做的那样。我尝试过使用 base.append('key'),尝试过 base.get(),但找不到有关如何将其用于多个键的参考。关于如何绕过它的任何想法?

【问题讨论】:

  • 你试过get()的默认值吗,例如:base.get('vevo', {})
  • 我会为 {} 放什么?这对 ['vevo']['viewsLastWeek']['data']['time'] 有什么作用?我不完全了解如何使用base.get(),但我觉得这可能是解决方案
  • 你也可以再试一次,除了像 try: base['vevo'] except base['vevo']="not Found vevo"
  • base.get(key, defaultvalue) 表示如果key不存在则key有这个defaultvalue
  • 我是否必须继续为树上的每个键分配“NotFound”?类似于 base['vevo']['viewsLastWeek'] = "NotFound" ,然后是 base['vevo']['viewsLastWeek']['data'] = "NotFound"

标签: python dictionary web-scraping data-analysis


【解决方案1】:

您可以使用defaultdict

import collections
def new_level():
    return collections.defaultdict(new_level)
base=new_level()

这将允许您向嵌套字典添加任意数量的级别:

 >>> base["foo"]["bar"]["foobar"]=42
 {'foo': {'bar': {'foobar': 42}}}

【讨论】:

  • 这似乎已经解决了第一个问题,但是现在当我print base['vevo']['url'] 它给了我defaultdict(<function new_level at 0xb4825bc4>, {}。对于字典中的所有现有值,它似乎也这样做了。我是否必须做其他事情才能查看实际值后记?
  • 您可以使用json 来设置字符串表示的样式:print json.dumps(base)。或者这里有其他解决方案stackoverflow.com/questions/12925052/…
  • 哦不,等等。发生的情况是,当您调用 base['vevo']['url'] 并且它不存在时,它将调用 new_level 并创建一个字典。如果要检查键是否存在,请使用"url" in base['vevo'] 以避免创建新的嵌套字典。
【解决方案2】:

所以我找到了一个解决方案,但它涉及到逻辑上的改变,而不是我最初尝试做的事情。

由于我只使用字典值保存到我的数据库,我可以使用占位符变量作为函数的中间值。工作代码见下文..

try: 
    v_url = base['vevo']['url']
except:
    v_url = "NotGiven"

向现有字典添加值被证明太复杂了,而且这个解决方案不涉及额外的包。

【讨论】:

    猜你喜欢
    • 2017-01-04
    • 2015-02-16
    • 2014-01-02
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    相关资源
    最近更新 更多