【问题标题】:Is there a more pythonic way to do this dictionary iteration?有没有更 Pythonic 的方式来做这个字典迭代?
【发布时间】:2011-05-04 13:26:50
【问题描述】:

我在视图层中有一本字典,我将其传递给我的模板。字典值(大部分)是列表,尽管一些标量也存在于字典中。如果存在列表,则将其初始化为 None。

None 值在模板中被打印为“None”,所以我编写了这个小函数来清除 None,然后将列表字典传递给模板。由于我是 Python 新手,我想知道是否有更 Python 的方式来做到这一点?

# Clean the table up and turn Nones into ''

for k, v in table.items():
#debug_str = 'key: %s, value: %s' % (k,v)
#logging.debug(debug_str)

try:
    for i, val in enumerate(v):
        if val == None: v[i] = ''

except TypeError:
    continue;

【问题讨论】:

  • 你为什么不用collections.defaultdict
  • 因为我是新手?使用 collections.defaultdict 有什么好处?

标签: python django-templates django-views


【解决方案1】:

您是否查看过集合中的defaultdict?您将通过

形成字典
defaultdict(list)

当查询一个键并且该键不存在时初始化一个空列表。

【讨论】:

  • 从示例中,看来 OP 在他试图摆脱的字典中的列表中有 None 值,所以这在两个方面不起作用。
  • @user470379。字典中的None 值可能是一个简单的错误,基于未能首先使用defaultdict。解决问题 - 如所要求的那样 - 并不总是最好的。预防问题(如上所述)通常比“解决”问题更好。
  • @user470379 我认为当没有列表时,它会读取字典中有None 值。
  • 如果 OP 想要的不是空列表,那么总是有 defaultdict(lambda:<desired default value>) <desired default value> 几乎可以满足任何需要。
【解决方案2】:
filtered_dict = dict((k, v) for k, v in table.items() if v is not None)

或在 Python 2.7+ 中,使用字典理解语法:

filtered_dict = {k: v for k, v in table.items() if v is not None}

【讨论】:

    猜你喜欢
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 2015-02-10
    相关资源
    最近更新 更多