将多个元素添加到字典中的列表中

时间:2015-08-26 12:17:59

标签: python list dictionary

所以我用这个方法从文本文件中设置参数:

def set_params(self, params, previous_response=None):
        if len(params) > 0:
            param_value_list = params.split('&')
            self.params = {
                param_value.split()[0]: json.loads(previous_response.decode())[param_value.split()[1]] if
                param_value.split()[0] == 'o' and previous_response else param_value.split()[1]
                for param_value in param_value_list
            }

当我这样称呼这个方法时:

apiRequest.set_params("lim 5 & status active")

//now self.params={"lim" : 5, "status" : "active"}

效果很好。现在我希望能够多次添加相同的参数,当发生这种情况时,将param设置为列表:

apiRequest.set_params("lim 5 & status active & status = other")

//I want this: self.params={"lim" : 5, "status" : ["active", "other"]}

如何精美地修改此方法?我能想到的只是有点难看...我是python的新手

1 个答案:

答案 0 :(得分:1)

尽可能简单直接地写出来。这通常是最好的方法。在下面的代码中,我对您的要求进行了一处更改:所有值都是列表,有些可能只有列表中的一个元素。

在这种方法中,我应用以下选择和技巧:

  • 解码并解析前一个响应只有一次,而不是每次引用它
  • 以空字典开头
  • 只将每个字符串拆分一次:这样更快,因为它避免了冗余操作和内存分配,并且(更重要的是)它更容易阅读,因为代码不重复
  • 根据特例
  • 调整value
  • 使用setdefault()获取当前值列表(如果存在),或者设置新的空列表对象(如果不存在)
  • 将新值附加到值列表
def set_params(self, params, previous_response=None):
    if len(params) <= 0:
        return
    previous_data = json.loads(previous_response.decode())
    self.params = {}
    for param_value in params.split('&'):
        key, value = param_value.split()
        if key == 'o' and previous_response:
            value = previous_data[value]

        values = self.params.setdefault(key, [])
        values.append(value)
# end set_params()
  

调试是第一次编写代码的两倍。   因此,如果您尽可能巧妙地编写代码,那么您就是   定义,不够聪明,不能调试它。

   — Brian W. Kernighan and P. J. Plauger in The Elements of Programming Style.
     

参考:http://quotes.cat-v.org/programming/