【问题标题】:How to make my code more simple using python如何使用 python 使我的代码更简单
【发布时间】:2011-04-02 10:35:44
【问题描述】:

这是我的代码:

def set_floor_point(self,floor_point=None):
    if self.data.get('stage'):
        self.data['stage'] = {}
    stage_number = self.get_stage_number()
    floor_number = self.get_floor_number()

    if self.data['stage'].get(stage_number):
        self.data['stage'][stage_number] = {}

    if self.data['stage'][stage_number].get('floor_point'):
        self.data['stage'][stage_number]['floor_point'] = {}

    if self.data['stage'][stage_number]['floor_point'].get(floor_number):
        self.data['stage'][stage_number]['floor_point'][floor_number] = {}


    self.data['stage'][stage_number]['floor_point'][floor_number] = floor_point

我第一次创建的字典是这样的:

stage = 
{
    0:{
        'floor':{
            0:{
                'floor_point':0,
                'gift':{}
            }
        }
    }
}

但是我觉得我的代码不是很好,太繁琐了,

所以有人知道更简单的方法吗,

谢谢

【问题讨论】:

  • 默认情况下,dictget() 方法在密钥不存在时返回None,所以也许你的意思是if not some_dict.get():。即使这样也可能被逻辑上为False 的键 所欺骗,例如0''[]。使用if not some_dict.has_key()if key not in some_dict 可能更好。

标签: python dictionary


【解决方案1】:
data = collections.defaultdict(lambda: collections.defaultdict(
  lambda: collections.defaultdict(dict)))
data['stage'][3]['floor_point'][2] = 5
print data

【讨论】:

    【解决方案2】:

    我不确定你想要实现什么。您的代码中反复出现的主题是:

    if some_dict.get(key):
        some_dict[key] = {}
    

    这意味着:如果some_dict 有一个键key 并且some_dict[key] 是一个真实值,那么将some_dict[key] 替换为{}。如果some_dict 没有键keysome_dict[key] 是一个假值(None0False[] 等),则什么也不做。

    如果这是你想要的,你可以这样澄清你的:

    def replace_value_by_empty_dict(d, key):
        if d.get(key):
            d[key] = {}
    ...
    replace_value_by_empty_dict(self.data, 'stage')
    etc.
    

    但如果这不是您想要的(如果ifs 之一为真,则代码将中断),您可能需要用英文单词或伪代码来表述问题以阐明问题的结构。

    看看collections.defaultdict

    【讨论】:

    • 恕我直言,以这种方式使用get() 测试字典键的存在是一种糟糕的做法——无论它是否包含在函数中。
    • @martineau:你说得对,我们有key in some_dict 用于测试密钥是否存在。我的目的是澄清 zjm1126 的代码实际上做了什么。我怀疑这是他的意图。
    猜你喜欢
    • 2018-07-23
    • 2021-05-07
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多