2

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

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

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

4

3 回答 3

2

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

>>> max([i.split('-')[1] for i in zip(*L)[0]])
'003'
于 2013-08-27T18:12:51.290 回答
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接受任何interable并返回最大的元素。生成器是可迭代的,占用 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迭代遍历 的子列表Lsubl[0]获取每个子列表的第 0 个元素。然后我们调用rsplit('-' ,1),它将字符串分成两部分,在-字符串末尾的第一个出现处;拆分显示在列表中。该列表的第 0 个索引位于左侧,-第 1 个索引位于右侧。由于数字在右边,我们取subl[0].rsplit('-',1)[1].
在这一点上,我们只有字符串'003',我们想把它变成一个int用于maxing 的目的。所以我们调用int(subl[0].rsplit('-',1)[1]). 这就是生成所有所需数字的方式,max然后将最大的数字拉出

于 2013-08-27T18:05:17.420 回答
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 排序/最大/等。函数接受一个key参数:

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

max函数考虑通过应用于key的每个元素生成的值L

于 2013-08-27T18:12:55.170 回答