2012-02-07 88 views
0

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

字典中的键的顺序是否重要?我的意思是,钥匙真的是“一个”,“两个”,“三个”,你想按照通常的顺序使用它们吗? – 2012-02-07 17:37:09

+0

@Sven Marnach没有顺序无关紧要。 – Jeff 2012-02-07 17:38:33

+0

[Python中的移调/解压缩函数]的可能重复(http://stackoverflow.com/questions/19339/a-transpose-unzip-function-in-python) – 2012-02-07 17:39:27

回答

2

查看Unpacking Argument Lists的文档。通过将*放置在作为函数参数的迭代器前面,函数将使用该迭代器中的元素作为其参数进行调用。例如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这非常简洁,但元组顺序将是任意的。

4

如果字典项的顺序并不重要,你可以做

zip(*d.values()) 

,以获得期望的结果。