如何获取元组列表中的第一个元素?

我有一个像下面这样的列表,第一个元素是id,另一个是string:

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

我只想从这个元组列表中创build一个id列表,如下所示:

 [1,2] 

我将在__in使用这个列表,所以它需要是一个整数值列表。 请帮忙!

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

使用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(zip(*inpt))[0]) (1, 2) 

你的意思是这样吗?

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

你实际上有一个tuple对象列表,而不是一tuple列表(如你原来的问题所暗示的)。 如果它实际上是一组集合,那么没有第一个元素,因为集合没有顺序。

在这里我创build了一个扁平列表,因为通常这比创build一个元素元组清单更有用。 但是,只需用(seq[0],)replaceseq[0] ,就可以轻松创build一个元素元组的列表。

你可以使用“元组解包”:

 >>> my_list = [(1, u'abc'), (2, u'def')] >>> my_ids = [idx for idx, val in my_list] >>> my_ids [1, 2] 

在迭代时,每个元组都被解压缩,并且其值被设置为variablesidxval

 >>> x = (1, u'abc') >>> idx, val = x >>> idx 1 >>> val u'abc' 

这是operator.itemgetter的用途。

 >>> 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更清晰更明确 。

这对于制作简洁的sorting语句非常方便。 例如,

 >>> 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'] >>> 

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

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

当我跑(如上build议):

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

而不是返回:

 [1, 2] 

我收到了这个回报:

 <map at 0xb387eb8> 

我发现我不得不使用list():

 >>> b = list(map(operator.itemgetter(0), a)) 

使用这个build议成功返回一个列表。 这就是说,我很高兴这个解决scheme,谢谢。 (使用Spyder,iPython控制台,Python v3.6进行testing/运行)