将平面Python字典转换为字典列表

4
我有一个以下格式的字典,我并不知道我将会接收到多少行或项目:
{'line(0).item1':'a', 'line(0).item2':'34', 
 'line(1).item1':'sd', 'line(1).item2':'2', 'line(1).item3':'fg', 
 'line(2).item1':'f' ... }

什么是最具Python特色的方法将其解析为以下格式的字典列表:
[{'item1':'a', 'item2':'34'}, 
 {'item1':'sd', 'item2':'2', 'item3':'fg'}, 
 {'item1':'f',...}, ...]

感谢您的提前帮助。
2个回答

5
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'}]

0

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

遍历此 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])

这只能运行到第9行... 另外,你应该使用dict.setdefault或collections.defaultdict来替换if。 - JBernardo
@JBernardo 为什么只能在 line(9) 前有效呢?我这里没看到任何单个数字的假设... - immortal
抱歉,我看到了+1,但忘记了切片操作。 - JBernardo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接