我有一个以下格式的字典,我不知道我将收到的行数或项目数:
{'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',...}, ...]
提前致谢。
答案 0 :(得分: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'}]
答案 1 :(得分: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])