如何在Python中切片元组列表?

22

假设:

L = [(0,'a'), (1,'b'), (2,'c')]

如何将每个元组的索引0作为预期结果获取:

[0, 1, 2]
为了达到这个目的,我使用了 Python 列表推导式 并解决了这个问题:
[num[0] for num in L]

尽管如此,一定有一种Pythonic的方法可以像 L[:1] 这样对其进行切片,但是当然这种切片不起作用。

是否有更好的解决方案?


2
列表推导式的解决方案出了什么问题? - Nhor
6
我认为你的列表推导式解决方案 完成这个任务的最佳方式。 - Alex Riley
5
不要将你的列表命名为“list”。 “list”是类型名称。 - khelwood
@Nhor,没有什么问题,我只是想避免它,并寻找一个“切片解决方案”。 - Shapi
如果你真的想使用切片,根据@Emile和@TigerhawkT3的回答,你只有两个选项:1)[num[:1] for num in L]或2)zip(*list)[:1] - Nhor
显示剩余3条评论
5个回答

9
您可以使用zip()*解包。
>>> l = [(0,'a'), (1,'b'), (2,'c')]
>>> for item in zip(*l)[0]:
...     print item,
...
0 1 2

对于Python 3,zip()不会自动产生一个list,因此您需要将zip对象发送到list()或使用next(iter())等方法:

>>> l = [(0,'a'), (1,'b'), (2,'c')]
>>> print(*next(iter(zip(*l))))
0 1 2

但是您的已经非常好了。

2
请注意,OP在问题中标记了2.7,因此他们只需要使用zip(*l)[0] - Ashwini Chaudhary

2
你的解决方案对于我来说看起来最符合Python语言特点;你也可以这样做:
tuples = [(0,'a'), (1,'b'), (2,'c')]
print zip(*tuples)[0]

...但对我而言,那太“聪明”了,列表推导式版本更清晰易懂。


3
变量命名为“list”会覆盖内置的“list”。 - styvane
2
但是OP先做了!疯狂编辑我不知道你在说什么,先生。 - Emile

2
你可以将它转换为numpy数组。
import numpy as np
L = [(0,'a'), (1,'b'), (2,'c')]
a = np.array(L)
a[:,0]

0

那么 map 呢?

map(lambda (number, letter): number, L)

在Python 2中进行切片操作

map(lambda (number, letter): number, L)[x:y]

在Python 3中,您必须首先将其转换为列表:

list(map(lambda (number, letter): number, L))[x:y]

-1
>>> list = [(0,'a'), (1,'b'), (2,'c')]
>>> l = []
>>> for t in list:
        l.append(t[0])

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