【问题标题】:Converting flat Python Dictionary to List of Dictionaries将平面 Python 字典转换为字典列表
【发布时间】:2011-12-08 08:56:19
【问题描述】:

我有一本格式如下的字典,但我不知道我将要接收的行数或项目数:

{'line(0).item1':'a', 'line(0).item2':'34', 
 'line(1).item1':'sd', 'line(1).item2':'2', 'line(1).item3':'fg', 
 'line(2).item1':'f' ... }

将其解析为以下格式的字典列表的最 Pythonic 方式是什么:

[{'item1':'a', 'item2':'34'}, 
 {'item1':'sd', 'item2':'2', 'item3':'fg'}, 
 {'item1':'f',...}, ...]

提前致谢。

【问题讨论】:

    标签: python loops dictionary


    【解决方案1】:

    我会选择一个中间字典,因为无法知道最后有多少“行”,并且以后无法在列表末尾插入新元素。

    遍历dict 中的每个元素并将其解析为行号和键应该足够简单。然后,您可以轻松地将新的dict 转移到您想要的列表中。一个可能的实现可能是:

    intermediate_dict = {}
    for entry in my_dict:
        line_string, key = entry
        line_number = int(line_string[line_string.index('(') + 1: line_string.index(')')])
        if line_number not in intermediate_dict:
            intermediate_dict[line_number] = {}
        intermediate_dict[line_number][key] = my_dict[entry]
    
    new_list = []
    for i in xrange(len(intermediate_dict)):
        new_list.append(intermediate_dict[i])
    

    【讨论】:

    • 这仅适用于line(9)...另外,您应该使用dict.setdefaultcollections.defaultdict 替换if
    • @JBernardo 为什么它只能工作到line(9)?我在这里没有看到任何单个数字的假设......
    • 抱歉,我看到了+1,但忘记了切片。
    【解决方案2】:
    d = {'line(0).item1':'a' ...}
    
    out = collections.defaultdict(list)
    for k,v in d.items():
        n,val = re.findall(r'^line\((\d+)\)\.(\w+)$', k)[0]
        out[int(n)].append((val,v))
    
    my_list = [dict(out[v]) for v in sorted(out)]
    

    并且输出将是预期的:

    [{'item2': '34', 'item1': 'a'}, {'item2': '2', 'item3': 'fg', 'item1': 'sd'}, {'item1': 'f'}]
    

    【讨论】:

      猜你喜欢
      • 2016-06-16
      • 2015-07-23
      • 1970-01-01
      • 2018-08-21
      • 1970-01-01
      • 1970-01-01
      • 2019-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多