我有一个列表字典,列表代表列。所有列表的长度相同,列表的数量是可变的。我想将列列表转换为行列表。它不必以字典结尾,矩阵是完美的;但是,我不能使用numpy
。
例如:设置看起来像这样
>>> A = [ 1 , 2 , 3 , 4 , 5 , 6]
>>> B = ["A", "B", "C", "D", "E", "F"]
>>> C = ["J", "K", "L", "M", "N", "O"]
>>> d = {"One": A, "Two": B, "Three": C}
在这里做魔术并获得以下
[(1, 'A', 'J'), (2, 'B', 'K'), (3, 'C', 'L'), (4, 'D', 'M'), (5, 'E', 'N'), (6, 'F', 'O')]
请注意,cols中的第一个元素现在在一行中。现在我可以通过
来实现这个目标>>> zip(d["One"], d["Two"], d["Three"])
但这只有在字典条目数量不变的情况下才有效。如果字典条目的数量是可变的,我该怎么做?希望我很清楚。
答案 0 :(得分:4)
如果字典项的顺序无关紧要,你可以
zip(*d.values())
获得理想的结果。
答案 1 :(得分:2)
查看Unpacking Argument Lists的文档。通过将*
放在作为函数参数的iterable前面,将使用该iterable中的元素作为参数调用该函数。例如,zip(*['ab', 'cd', 'ef'])
将成为zip('ab', 'cd', 'ef')
。
使用此方法,您可以生成任意大小的字典的压缩列表,但请注意,由于字典是无序的,因此您需要提供单独的列表以用作生成的列组的顺序,例如:
>>> A = [ 1 , 2 , 3 , 4 , 5 , 6]
>>> B = ["A", "B", "C", "D", "E", "F"]
>>> C = ["J", "K", "L", "M", "N", "O"]
>>> d = {"One": A, "Two": B, "Three": C}
>>> order = ["One", "Two", "Three"]
>>> zip(*[d[k] for k in order])
[(1, 'A', 'J'), (2, 'B', 'K'), (3, 'C', 'L'), (4, 'D', 'M'), (5, 'E', 'N'), (6, 'F', 'O')]
如果列顺序无关紧要,您可以使用非常简洁的Sven's solution,但元组顺序将是任意的。