Python元组解包

12

如果我拥有

 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个回答

16

使用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
使用列表推导式..
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 

0

只需解压并创建列表:

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

请查看zip的文档。


我本希望避免将其分成两行。我最初的设置是... num = filter(lambda x: x[0], num_and_words) 和 words = filter(lambda x: x[1], num_and_words)。 - Raphi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接