我有一个列表列表,需要找到一种方法来查找每个列表中元素[0]
的数字部分的最大值。我知道这将涉及切片和查找max并认为它将涉及zip(*L)
函数,但不知道如何到达那里。例如,我所拥有的列表列表如下所示:
L = [['ALU-001', 'Aluminum', 50], ['LVM-002', 'Livermorium', 20], ['ZIN-003', 'Zinc', 30]]
并且需要找到第一个元素的最大数字部分(例如001)。
答案 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
的每个元素而生成的值。