当dict中的值是一个列表时,如何对dict进行拆分?

时间:2019-03-28 03:04:20

标签: python python-3.x

我有一个字典,其中键是字符串,值是包含一些数字的列表,例如代码中的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}, ]

2 个答案:

答案 0 :(得分:0)

zip所有值列表在一起,然后使用键将每个结果tuple压缩成新的dict

result = [dict(zip(d, vs)) for vs in zip(*d.values())]

Try it online!

之所以可行,是因为dict的迭代顺序与其值的迭代顺序一致(它的插入顺序为3.6+,但对于所有版本的给定Python运行都是一致的);在“每次循环” dzip中的键将按照在前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