列到列表的列表
问题描述:
我有一个列表字典,列表代表列。所有列表长度相同,列表数量可变。我想将列的列表转换为行列表。它不必在字典中结束矩阵是完美的;但是,我不能使用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"])
但这只会工作,如果字典条目的数量是恒定的。如果字典条目的数量可变,我该如何做到这一点?希望我清楚。
答
查看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这非常简洁,但元组顺序将是任意的。
答
如果字典项的顺序并不重要,你可以做
zip(*d.values())
,以获得期望的结果。
字典中的键的顺序是否重要?我的意思是,钥匙真的是“一个”,“两个”,“三个”,你想按照通常的顺序使用它们吗? – 2012-02-07 17:37:09
@Sven Marnach没有顺序无关紧要。 – Jeff 2012-02-07 17:38:33
[Python中的移调/解压缩函数]的可能重复(http://*.com/questions/19339/a-transpose-unzip-function-in-python) – 2012-02-07 17:39:27