我有一个像下面这样的列表,其中第一个元素是id,另一个是字符串:

[(1, u'abc'), (2, u'def')]

我只想从下面的元组列表中创建一个id列表:

[1,2]

我将在__in中使用这个列表,因此它需要是一个整数值列表。


当前回答

这就是什么算子。Itemgetter是for。

>>> a = [(1, u'abc'), (2, u'def')]
>>> import operator
>>> b = map(operator.itemgetter(0), a)
>>> b
[1, 2]

itemgetter语句返回一个函数,该函数返回您指定的索引处的元素。这和写作完全一样

>>> b = map(lambda x: x[0], a)

但我发现itemgetter更清晰、更明确。

这对于创建紧凑排序语句很方便。例如,

>>> c = sorted(a, key=operator.itemgetter(0), reverse=True)
>>> c
[(2, u'def'), (1, u'abc')]

其他回答

>>> a = [(1, u'abc'), (2, u'def')]
>>> [i[0] for i in a]
[1, 2]

如果元组是唯一的,那么这可以工作

>>> a = [(1, u'abc'), (2, u'def')]
>>> a
[(1, u'abc'), (2, u'def')]
>>> dict(a).keys()
[1, 2]
>>> dict(a).values()
[u'abc', u'def']
>>> 

使用zip函数解耦元素:

>>> inpt = [(1, u'abc'), (2, u'def')]
>>> unzipped = zip(*inpt)
>>> print unzipped
[(1, 2), (u'abc', u'def')]
>>> print list(unzipped[0])
[1, 2]

编辑(@BradSolomon): 以上内容适用于Python 2。X,其中zip返回一个列表。

在Python 3中。X, zip返回一个迭代器,下面的等价于上面的:

>>> print(list(list(zip(*inpt))[0]))
[1, 2]

我更喜欢这样拉:

>>> lst = [(1, u'abc'), (2, u'def')]
>>> new, _ = zip(*lst)
>>> new
(1, 2)
>>> 

或者如果你不知道有多少额外的值

>>> new, *_ = zip(*lst)
>>> new
(1, 2)
>>> 

这些是元组,不是集合。你可以这样做:

l1 = [(1, u'abc'), (2, u'def')]
l2 = [(tup[0],) for tup in l1]
l2
>>> [(1,), (2,)]