如何获取元组列表中的第一个元素?

2025-02-20 09:22:00
admin
原创
26
摘要:问题描述:我有一个如下所示的列表,其中第一个元素是 id,另一个元素是字符串:[(1, u'abc'), (2, u'def')] 我只想从这个元组列表中创建一个 ID 列表,如下所示:[1,2] 我将使用这个列表,__in因此它需要是一个整数值列表。解决方案 1:>>> a = [(1, ...

问题描述:

我有一个如下所示的列表,其中第一个元素是 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]

在迭代时,每个元组被解包并且它的值被设置为变量idxval

>>> 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)]
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1325  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。它涵盖了从产品概念产生到产品退市的整个生命周期,通过整合跨部门团队、优化流程等方式,显著提升产品开发的效率和质量,进而为项目的成功奠定坚实基础。深入探究IPD流程的五个阶段与项目成功之间...
IPD流程分为几个阶段   4  
  华为作为全球知名的科技企业,其成功背后的管理体系备受关注。IPD(集成产品开发)流程作为华为核心的产品开发管理模式,其中的创新管理与实践更是蕴含着丰富的经验和深刻的智慧,对众多企业具有重要的借鉴意义。IPD流程的核心架构IPD流程旨在打破部门墙,实现跨部门的高效协作,将产品开发视为一个整体的流程。它涵盖了从市场需求分析...
华为IPD是什么   3  
  IPD(Integrated Product Development)研发管理体系作为一种先进的产品开发模式,在众多企业的发展历程中发挥了至关重要的作用。它不仅仅是一套流程,更是一种理念,一种能够全方位提升企业竞争力,推动企业持续发展的有效工具。深入探究IPD研发管理体系如何助力企业持续发展,对于众多渴望在市场中立足并...
IPD管理流程   3  
  IPD(Integrated Product Development)流程管理旨在通过整合产品开发流程、团队和资源,实现产品的快速、高质量交付。在这一过程中,有效降低成本是企业提升竞争力的关键。通过优化IPD流程管理中的各个环节,可以在不牺牲产品质量和性能的前提下,实现成本的显著降低,为企业创造更大的价值。优化产品规划...
IPD流程分为几个阶段   4  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用