我有一个像下面这样的列表,其中第一个元素是id,另一个是字符串:
[(1, u'abc'), (2, u'def')]
我只想从下面的元组列表中创建一个id列表:
[1,2]
我将在__in中使用这个列表,因此它需要是一个整数值列表。
我有一个像下面这样的列表,其中第一个元素是id,另一个是字符串:
[(1, u'abc'), (2, u'def')]
我只想从下面的元组列表中创建一个id列表:
[1,2]
我将在__in中使用这个列表,因此它需要是一个整数值列表。
当前回答
使用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]
其他回答
你是说像这样的事吗?
new_list = [ seq[0] for seq in yourlist ]
实际上,您拥有的是一个元组对象列表,而不是一个集合列表(正如您最初的问题所暗示的那样)。如果它实际上是一个集合的列表,那么就没有第一个元素,因为集合没有顺序。
这里我创建了一个平面列表,因为一般来说,这似乎比创建一个只有一个元素元组的列表更有用。但是,只需用(seq[0],)替换seq[0],就可以轻松创建一个只有1个元素元组的列表。
我更喜欢这样拉:
>>> 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,)]
从性能的角度来看,在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
>>> a = [(1, u'abc'), (2, u'def')]
>>> [i[0] for i in a]
[1, 2]