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

时间:2013-08-27 18:03:42

标签: python list zip max slice

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

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

并且需要找到第一个元素的最大数字部分(例如001)。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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接受任何可互换并返回最大元素。生成器是可迭代的并且占用O(1)空间而不是列表,其占用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',为了int的目的,我们要将其转换为max。所以我们打电话给int(subl[0].rsplit('-',1)[1])。这就是如何产生所有必需的数字,max然后拉出最大的数字

答案 2 :(得分:1)

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的每个元素而生成的值。