如何获取元组列表中的第一个元素?
我有一个像下面这样的列表,第一个元素是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]
在迭代时,每个元组都被解压缩,并且其值被设置为variablesidx
和val
。
>>> 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/运行)