我有一个像下面这样的列表,其中第一个元素是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]

其他回答

我认为比较不同方法的运行时可能是有用的,所以我做了一个基准测试(使用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()

当我运行时(如上所述):

>>> 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测试/运行)

我更喜欢这样拉:

>>> lst = [(1, u'abc'), (2, u'def')]
>>> new, _ = zip(*lst)
>>> new
(1, 2)
>>> 

或者如果你不知道有多少额外的值

>>> new, *_ = zip(*lst)
>>> new
(1, 2)
>>> 

如果你需要转换为一个嵌套的列表,答案将是:

a = [(1, u'abc'), (2, u'def')]
print([list(i[0]) for i in a])

输出:

[[1], [2]]

另一个简单的建议是,如果你需要转换为一个嵌套的元组,并且列表中的所有元素的答案将是:

s=[]
for i in range(len(a)):
    s.append(a[i][0])
print(s)

输出:

[(1),(2)]