我有一个像下面这样的列表,其中第一个元素是id,另一个是字符串:
[(1, u'abc'), (2, u'def')]
我只想从下面的元组列表中创建一个id列表:
[1,2]
我将在__in中使用这个列表,因此它需要是一个整数值列表。
我有一个像下面这样的列表,其中第一个元素是id,另一个是字符串:
[(1, u'abc'), (2, u'def')]
我只想从下面的元组列表中创建一个id列表:
[1,2]
我将在__in中使用这个列表,因此它需要是一个整数值列表。
当前回答
你可以使用“元组解包”:
>>> my_list = [(1, 'abc'), (2, 'def')]
>>> my_ids = [idx for idx, val in my_list]
>>> my_ids
[1, 2]
在迭代时,每个元组被解包,其值被设置为变量idx和val。
>>> x = (1, 'abc')
>>> idx, val = x
>>> idx
1
>>> val
'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']
>>>
从性能的角度来看,在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
使用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]
当我运行时(如上所述):
>>> 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))
使用此建议成功返回一个列表。也就是说,我对这个解决方案很满意,谢谢。(使用Spyder、iPython控制台、Python v3.6测试/运行)
你可以解包你的元组,使用列表推导式只得到第一个元素:
l = [(1, u'abc'), (2, u'def')]
[f for f, *_ in l]
输出:
[1, 2]
不管你在元组中有多少个元素,这都是有效的:
l = [(1, u'abc'), (2, u'def', 2, 4, 5, 6, 7)]
[f for f, *_ in l]
输出:
[1, 2]