我有一个像下面这样的列表,其中第一个元素是id,另一个是字符串:
[(1, u'abc'), (2, u'def')]
我只想从下面的元组列表中创建一个id列表:
[1,2]
我将在__in中使用这个列表,因此它需要是一个整数值列表。
我有一个像下面这样的列表,其中第一个元素是id,另一个是字符串:
[(1, u'abc'), (2, u'def')]
我只想从下面的元组列表中创建一个id列表:
[1,2]
我将在__in中使用这个列表,因此它需要是一个整数值列表。
当前回答
我想知道为什么没有人建议使用numpy,但现在检查后我明白了。对于混合类型数组,它可能不是最好的。
这将是numpy中的一个解决方案:
>>> import numpy as np
>>> a = np.asarray([(1, u'abc'), (2, u'def')])
>>> a[:, 0].astype(int).tolist()
[1, 2]
其他回答
你可以解包你的元组,使用列表推导式只得到第一个元素:
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]
如果你需要转换为一个嵌套的列表,答案将是:
a = [(1, u'abc'), (2, u'def')]
print([list(i[0]) for i in a])
输出:
[[1], [2]]
你可以使用“元组解包”:
>>> 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'
我想知道为什么没有人建议使用numpy,但现在检查后我明白了。对于混合类型数组,它可能不是最好的。
这将是numpy中的一个解决方案:
>>> import numpy as np
>>> a = np.asarray([(1, u'abc'), (2, u'def')])
>>> a[:, 0].astype(int).tolist()
[1, 2]
我认为比较不同方法的运行时可能是有用的,所以我做了一个基准测试(使用simple_benchmark库)
I)具有2个元素的元组的基准测试
由于您可能希望通过索引0从元组中选择第一个元素,因此通过期望恰好有2个值,0显示出非常接近解包解决方案的最快解决方案
import operator
import random
from simple_benchmark import BenchmarkBuilder
b = BenchmarkBuilder()
@b.add_function()
def rakesh_by_index(l):
return [i[0] for i in l]
@b.add_function()
def wayneSan_zip(l):
return list(list(zip(*l))[0])
@b.add_function()
def bcattle_itemgetter(l):
return list(map(operator.itemgetter(0), l))
@b.add_function()
def ssoler_upacking(l):
return [idx for idx, val in l]
@b.add_function()
def kederrack_unpacking(l):
return [f for f, *_ in l]
@b.add_arguments('Number of tuples')
def argument_provider():
for exp in range(2, 21):
size = 2**exp
yield size, [(random.choice(range(100)), random.choice(range(100))) for _ in range(size)]
r = b.run()
r.plot()
II)基准具有2个或更多元素的元组
import operator
import random
from simple_benchmark import BenchmarkBuilder
b = BenchmarkBuilder()
@b.add_function()
def kederrack_unpacking(l):
return [f for f, *_ in l]
@b.add_function()
def rakesh_by_index(l):
return [i[0] for i in l]
@b.add_function()
def wayneSan_zip(l):
return list(list(zip(*l))[0])
@b.add_function()
def bcattle_itemgetter(l):
return list(map(operator.itemgetter(0), l))
@b.add_arguments('Number of tuples')
def argument_provider():
for exp in range(2, 21):
size = 2**exp
yield size, [tuple(random.choice(range(100)) for _
in range(random.choice(range(2, 100)))) for _ in range(size)]
from pylab import rcParams
rcParams['figure.figsize'] = 12, 7
r = b.run()
r.plot()