我有一个列表列表,需要找到一种方法来找到[0]
每个列表元素的数字部分的最大值。我知道它将涉及切片和查找最大值,并认为它会涉及该zip(*L)
功能,但并不真正知道如何到达那里。例如,我拥有的是一个如下所示的列表列表:
L = [['ALU-001', 'Aluminum', 50], ['LVM-002', 'Livermorium', 20], ['ZIN-003', 'Zinc', 30]]
并且需要找到第一个元素的最大数字部分(例如 001)。
您可以使用 zip(*L) 进行解压缩,并且由于数字比较与按字母顺序比较相同,因此如果数字具有固定宽度,则不必将数字部分转换为 int 。
>>> max([i.split('-')[1] for i in zip(*L)[0]])
'003'
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
迭代遍历 的子列表L
。subl[0]
获取每个子列表的第 0 个元素。然后我们调用rsplit('-' ,1)
,它将字符串分成两部分,在-
字符串末尾的第一个出现处;拆分显示在列表中。该列表的第 0 个索引位于左侧,-
第 1 个索引位于右侧。由于数字在右边,我们取subl[0].rsplit('-',1)[1]
.
在这一点上,我们只有字符串'003'
,我们想把它变成一个int
用于max
ing 的目的。所以我们调用int(subl[0].rsplit('-',1)[1])
. 这就是生成所有所需数字的方式,max
然后将最大的数字拉出
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
。