Python元组解包

时间:2015-03-12 20:43:07

标签: python list-comprehension iterable-unpacking

如果我有

 nums_and_words = [(1, 'one'), (2, 'two'), (3, 'three')]

并希望

nums = [1, 2, 3]
words= ['one', 'two', 'three']

我如何以Pythonic的方式做到这一点?我花了一分钟才意识到为什么以下不起作用

nums, words = [(el[0], el[1]) for el in nums_and_words]

我很好奇是否有人可以提供类似的方式来实现我正在寻找的结果。

3 个答案:

答案 0 :(得分:14)

使用zip,然后解压缩:

nums_and_words = [(1, 'one'), (2, 'two'), (3, 'three')]
nums, words = zip(*nums_and_words)

实际上,这会“解压缩”两次:首先,当您使用zip将列表列表传递给*时,然后将结果分发给两个变量。

您可以将zip(*list_of_lists)视为'转置'参数:

   zip(*[(1, 'one'), (2, 'two'), (3, 'three')])
== zip(  (1, 'one'), (2, 'two'), (3, 'three') )
== [(1, 2, 3), ('one', 'two', 'three')]

请注意,这将为您提供元组;如果你真的需要列表,你必须map结果:

nums, words = map(list, zip(*nums_and_words))

答案 1 :(得分:1)

使用列表理解..

nums = [nums_and_words[x][0] for x in xrange(len(nums_and_words)) ]
words = [nums_and_words[x][1] for x in xrange(len(nums_and_words)) ]
测试是否有效
print nums ,'&', words 

答案 2 :(得分:0)

只需解压缩并创建列表:

nums = list(zip(*nums_and_words)[0])
word = list(zip(*nums_and_words)[1])

请参阅zip文档。