我有一个像下面这样的列表,其中第一个元素是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')]
>>> a
[(1, u'abc'), (2, u'def')]
>>> dict(a).keys()
[1, 2]
>>> dict(a).values()
[u'abc', u'def']
>>> 

你是说像这样的事吗?

new_list = [ seq[0] for seq in yourlist ]

实际上,您拥有的是一个元组对象列表,而不是一个集合列表(正如您最初的问题所暗示的那样)。如果它实际上是一个集合的列表,那么就没有第一个元素,因为集合没有顺序。

这里我创建了一个平面列表,因为一般来说,这似乎比创建一个只有一个元素元组的列表更有用。但是,只需用(seq[0],)替换seq[0],就可以轻松创建一个只有1个元素元组的列表。

这就是什么算子。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')]

list1 = [a[i][0] for i in range(len(a))]

print(list1)

从性能的角度来看,在python3中。X

[i[0] for i in a]和list(zip(*a))[0]等价 它们比list(map(operator.itemgetter(0), a))更快

Code

import timeit


iterations = 100000
init_time = timeit.timeit('''a = [(i, u'abc') for i in range(1000)]''', number=iterations)/iterations
print(timeit.timeit('''a = [(i, u'abc') for i in range(1000)]\nb = [i[0] for i in a]''', number=iterations)/iterations - init_time)
print(timeit.timeit('''a = [(i, u'abc') for i in range(1000)]\nb = list(zip(*a))[0]''', number=iterations)/iterations - init_time)

输出

3.491014136001468 e-05

3.422205176000717 e-05