如果我拥有
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]
我想知道是否有人能够以类似的方式达到我所期望的结果。
如果我拥有
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]
我想知道是否有人能够以类似的方式达到我所期望的结果。
使用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))
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