我有一个字典,其中键是字符串,值是包含一些数字的列表,例如代码中的d。 我想返回一个列表,其中每个元素都是一个dict,其中包含输入dict中的所有键,并按升序包含值,例如代码中的result。 假设我们不知道列表中有多少个元素(在代码中可能不是3或4),但是元素的数量是相同的。
例如1:
d = {'1': [11, 12, 13], '2': [21, 22, 23], '3': [31, 32, 33]}
# ???
result = [{'1': 11, '2': 21, '3': 31},
{'1': 12, '2': 22, '3': 23},
{'1': 13, '2': 23, '3': 33}]
例如2:
d = {'1': [11, 12, 13, 14], '2': [21, 22, 23, 24], '3': [31, 32, 33, 34]}
# ???
result = [{'1': 11, '2': 21, '3': 31},
{'1': 12, '2': 22, '3': 23},
{'1': 13, '2': 23, '3': 33},
{'1': 14, '2': 24, '3': 34}, ]
答案 0 :(得分:0)
zip
所有值列表在一起,然后使用键将每个结果tuple
压缩成新的dict
:
result = [dict(zip(d, vs)) for vs in zip(*d.values())]
之所以可行,是因为dict
的迭代顺序与其值的迭代顺序一致(它的插入顺序为3.6+,但对于所有版本的给定Python运行都是一致的);在“每次循环” d
中zip
中的键将按照在前zip
中提取值的顺序进行迭代。
这假设“增加顺序”是指“保留输入的顺序”;如果不是这种情况,则有必要明智地使用内置的sorted
。
答案 1 :(得分:0)
假设您的值列表已排序,则以下代码可以很好地获得所需的输出。
def answer(testdict):
result = []
lengths = [len(v) for v in testdict.values()]
length = lengths[0]
for i in range(length):
newdict = {}
for j in testdict:
newdict[j] = testdict[j][i]
result.append(newdict)
print(result)
但是,如果未对值列表进行排序,请先尝试使用sorted
。