如何在Python中“解压”然后切片并查找列表中元素的最大值

2024-10-04 03:27:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个列表列表,需要找到一种方法来找到每个列表中元素[0]的数值部分的最大值。我知道这将涉及切片和查找max,并认为它将涉及zip(*L)函数,但不知道如何实现。例如,我的列表如下:

L = [['ALU-001', 'Aluminum', 50], ['LVM-002', 'Livermorium', 20], ['ZIN-003', 'Zinc', 30]]

需要找到第一个元素的最大数值部分(例如001)。你知道吗


Tags: 方法函数元素列表切片zipmax数值
3条回答

您可以使用zip(*L)解压,因为数字比较与按字母顺序比较相同,所以如果数字具有固定宽度,则不必将数字部分转换为int。你知道吗

>>> max([i.split('-')[1] for i in zip(*L)[0]])
'003'

zip是它自己的补充!你知道吗

L = [['ALU-001', 'Aluminum', 50], ['LVM-002', 'Livermorium', 20], ['ZIN-003', 'Zinc', 30]]
zip(*L)[0]
#=> ('ALU-001', 'LVM-002', 'ZIN-003')

不过,没必要在这里拉拉链。相反,大多数python sort/max/etc.函数采用key参数:

max(L,key=lambda (a,b,c):int(a.split('-')[1]))
#=> ['ZIN-003', 'Zinc', 30]

max函数考虑通过将key应用于L的每个元素而生成的值。你知道吗

max(int(subl[0].rsplit('-',1)[1]) for subl in L)

这将返回3。如果要打印'003',则可以执行以下操作:

print "%03d" %max(int(subl[0].rsplit('-',1)[1]) for subl in L)

解释:

您似乎已经知道,max获取一个数字列表并返回最大的一个。这几乎是正确的:max接受任何可交互的并返回最大的元素。生成器是一个iterable,占用O(1)个空间,而list则占用O(n)个空间。
您还可以使用列表理解来创建生成器(称为生成器理解),这就是我所做的。你知道吗

(int(subl[0].rsplit('-',1)[1]) for subl in L)

同:

def myGen():
    for subl in L:
        elem = subl[0]
        myNum = elem.rsplit('-', 1)
        myNum = int(myNum)
        yield myNum
max(myGen)

subl迭代迭代L的子列表。subl[0]获取每个子列表的第0个元素。然后我们调用rsplit('-' ,1),它在字符串末尾出现第一个-时将字符串拆分为两部分;拆分显示在一个列表中。这个列表的第0个索引是-左边的索引,第1个索引是右边的索引。因为数字在右边,所以我们取subl[0].rsplit('-',1)[1]
此时,我们只有字符串'003',为了max的目的,我们想把它转换成int。所以我们称之为int(subl[0].rsplit('-',1)[1])。这就是它如何生成所有所需的数字,然后max从中取出最大的一个

相关问题 更多 >