2016-11-17 67 views
2

我在Python 2.7的字典,这些具有以下结构压缩值相应的值。所以,在这种情况下,将创建三个新名单:从字典

[['a', 'd'], ['b', 'e'], ['c', 'f']] 

我知道我可以写一个可怕的寻找循环这样做,但我不知道是否有这样做的更pythonic的方法。我需要保持顺序。

+0

你有几把钥匙?只有两个(“1”和“2”)? – blacksite

回答

5

你可以做到以下几点:

zip(*x.values()) 

说明:

  • x.values()回报[['a', 'b', 'c'], ['d', 'e', 'f']](顺序可能会改变,所以你可能需要排序x第一)
  • zip([a, b], [c, d])回报[[a, c], [b, d]]
  • 要将x.values()扩展为参数zip,请将其加入*
+4

这没有确定的顺序。它可能产生'[['a','d'],...]或'[['d','a'],...]'。 –

+2

@DanD。如果你想通过按键顺序:'zip(* list(zip(* sorted(x.items())))[1])' –

-2
res = list(zip(x['1'], x['2'])) 
res = list(map(list, res)) 

的解释:

zip(x['1'], x['2']) 

创建一个zip对象,你对衔接。

res = list(zip(x['1'], x['2'])) 

zip对象现在成为元组列表。

list(map(list, res)) 

对于res(每个元组)的每个元素,从元组中的数据结构改变为list,因为你在你所希望的输出(在resmaplist数据类型到所有元素)要求上面。然后,将该对象转换为列表以达到最终的期望结果。

+0

这是行不通的,那些downvoted?它从字面上给出了上面显示的输出OP。 – blacksite

+3

您必须对密钥进行硬编码? –

+1

虽然此代码段可能会解决问题,包括解释[真的有帮助](http://meta.stackexchange.com/q/114762)以提高帖子的质量。请记住,你正在为将来的读者回答这个问题,而不仅仅是现在问的人!请编辑您的答案以添加解释,并指出适用的限制和假设。 – BrokenBinary

2

这是单线解决问题,但可能比你的循环更糟糕。它遍历已排序的键并生成一个传递给zip的列表,然后映射结果,将元组转换为列表。

>>> x = {'1': ['a', 'b', 'c'], '2': ['d', 'e', 'f']} 
>>> map(list, zip(*[x[k] for k in sorted(x)])) 
[['a', 'd'], ['b', 'e'], ['c', 'f']]