如何获取元组列表中的第一个元素?
- 2025-02-20 09:22:00
- admin 原创
- 27
问题描述:
我有一个如下所示的列表,其中第一个元素是 id,另一个元素是字符串:
[(1, u'abc'), (2, u'def')]
我只想从这个元组列表中创建一个 ID 列表,如下所示:
[1,2]
我将使用这个列表,__in
因此它需要是一个整数值列表。
解决方案 1:
>>> a = [(1, u'abc'), (2, u'def')]
>>> [i[0] for i in a]
[1, 2]
解决方案 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(list(zip(*inpt))[0]))
[1, 2]
解决方案 3:
我认为比较不同方法的运行时间可能会很有用,所以我做了一个基准测试(使用simple_benchmark库)
I)具有 2 个元素的元组的基准测试
正如您所期望的那样,通过索引从元组中选择第一个元素0
是最快的解决方案,它非常接近于解包解决方案,因为它期望正好有 2 个值
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()
解决方案 4:
你是指这样的吗?
new_list = [ seq[0] for seq in yourlist ]
您实际上拥有的是对象列表tuple
,而不是集合列表(正如您最初的问题所暗示的那样)。如果它实际上是集合列表,那么就没有第一个元素,因为集合没有顺序。
这里我创建了一个平面列表,因为一般来说这比创建一个 1 元素元组的列表更有用。但是,只需用 替换 ,就可以轻松创建一个 1 元素元组的seq[0]
列表(seq[0],)
。
解决方案 5:
这就是目的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
是一个更清晰、更明确的。
这对于制作紧凑的排序语句非常方便。例如,
>>> c = sorted(a, key=operator.itemgetter(0), reverse=True)
>>> c
[(2, u'def'), (1, u'abc')]
解决方案 6:
您可以使用“元组解包”:
>>> 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'
解决方案 7:
如果元组是唯一的,那么这可以工作
>>> 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']
>>>
解决方案 8:
从性能角度来说,在python3.X中
[i[0] for i in a]
并且list(zip(*a))[0]
等价它们比
list(map(operator.itemgetter(0), a))
代码
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)]
b = [i[0] for i in a]''', number=iterations)/iterations - init_time)
print(timeit.timeit('''a = [(i, u'abc') for i in range(1000)]
b = list(zip(*a))[0]''', number=iterations)/iterations - init_time)
输出
3.491014136001468e-05
3.422205176000717e-05
解决方案 9:
我更喜欢这样压缩:
>>> lst = [(1, u'abc'), (2, u'def')]
>>> new, _ = zip(*lst)
>>> new
(1, 2)
>>>
或者如果你不知道有多少个额外的值:
>>> new, *_ = zip(*lst)
>>> new
(1, 2)
>>>
解决方案 10:
当我跑步时(如上所述):
>>> 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 测试/运行)
解决方案 11:
您可以解开元组并使用列表推导仅获取第一个元素:
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]
解决方案 12:
我很奇怪为什么没人建议使用 numpy,但现在检查后我明白了。它可能不是混合类型数组的最佳选择。
这将是 numpy 中的一个解决方案:
>>> import numpy as np
>>> a = np.asarray([(1, u'abc'), (2, u'def')])
>>> a[:, 0].astype(int).tolist()
[1, 2]
解决方案 13:
要获取列表或元组的元素,可以迭代列表或元组
a = [(1, u'abc'), (2, u'def')]
list1 = [a[i][0] for i in range(len(a))]
print(list1)
解决方案 14:
使用列表理解的解决方案。
og_list = [(1, u'abc'), (2, u'def')]
list_of_keys = [key for key, _ in og_list]
输出
[1,2]
解决方案 15:
这些是元组,不是集合。你可以这样做:
l1 = [(1, u'abc'), (2, u'def')]
l2 = [(tup[0],) for tup in l1]
l2
>>> [(1,), (2,)]
解决方案 16:
如果需要转换为嵌套列表,答案将是:
a = [(1, u'abc'), (2, u'def')]
print([list(i[0]) for i in a])
输出:
[[1], [2]]
解决方案 17:
另一个简单的建议是,如果您需要转换为元组的嵌套,并且列表内的所有元素的答案将是:
s=[]
for i in range(len(a)):
s.append(a[i][0])
print(s)
输出:
[(1),(2)]
- 2025年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)