列表列的列表列表

时间:2012-02-07 17:34:30

标签: python

我有一个列表字典,列表代表列。所有列表的长度相同,列表的数量是可变的。我想将列列表转换为行列表。它不必以字典结尾,矩阵是完美的;但是,我不能使用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"])

但这只有在字典条目数量不变的情况下才有效。如果字典条目的数量是可变的,我该怎么做?希望我很清楚。

2 个答案:

答案 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,但元组顺序将是任意的。