繁体   English   中英

从Python中的选定列表元素中找到最大的数字

[英]Find Largest Number From Selected List Elements In Python

我正在使用Python 3.2.3,并希望从列表中的特定元素中找到最大数量。 保留有关哪个元素是最大元素的一些知识也是很重要的,但是要非常灵活地知道它是如何发生的。 让我解释...

背景

我有以下清单:

the_list = ['Order', '1', '5', 'Order', '2', '18', 'Order', '3', '45', 'Order', '4', '2', 'Order', '5', '8', 'Order', '6', '2', 'Order', '7', '1', 'Order', '8', '1', 'Order', '9', '1']

在每三个列表元素中,前两个描述数据-即“ Order 1”,“ Order 2”,“ Order 3”分别为“ Order”,“ 1”,...“ Order”,“ 2',...'Order','3',...一直到“ Order 9”。 这些不会改变,并提供每三个列表元素的来源或名称。

每三个列表元素中的第三个是相关信息。 在此示例中,数字为5 ... 18 ... 45 ... 2 ...,依此类推。 我想从这第三个元素中找到最大的元素。 在这种情况下,最大数字为45。这些数字一直在变化; 它们可以是0到100(含)之间的任何整数。

到目前为止我尝试过的

我尝试过两种方式使用Python的max()函数。 首先,简单地...

max(the_list)

...以“订单”作为最大值。 在我的目标上真是个无赖。

因此,我决定尝试制作一个仅由原始列表的每三个元素组成的新列表。 像这样

foo = (the_line[2], the_line[5], the_line[8], the_line[11], the_line[14], the_best_line[17], the_best_line[20], the_best_line[23], the_best_line[26])

max(foo)

...提供最大数字“ 8”,第15个列表元素和第5个第三列表元素。 这是一个数字,但不是最高数字[在此示例中] 45。

我还涉猎了一系列if-else语句,但是既不成功,又不存在一定的想法,那就是必须有一种更加Pythonic //优雅的方式。 我承认我可能在这条路线上退出的时间太早,并且/或者我的心态不正确。

这样的事情应该起作用:

>>> the_list = ['Order', '1', '5', 'Order', '2', '18', 'Order', '3', '45', 'Order', '4', '2', 'Order', '5', '8', 'Order', '6', '2', 'Order', '7', '1', 'Order', '8', '1', 'Order', '9', '1']
>>> the_list[::3]
['Order', 'Order', 'Order', 'Order', 'Order', 'Order', 'Order', 'Order', 'Order']
>>> the_list[2::3]
['5', '18', '45', '2', '8', '2', '1', '1', '1']
>>> max(int(num) for num in the_list[2::3])
45

在我使用Python的切片表示法的地方 ,使用the_list[2::3]从元素#2(即2 )开始获取了三分之一(即3 )元素。

但是, the_list其本身还不够,因为the_list的条目是字符串,并且按照字典顺序而不是数字顺序进行排序。 这就是为什么我必须在每个术语上调用int(num)并向max传递一个生成器表达式 ,这里的形式为“(someseq中的eleming)”。

您还说,跟踪哪个元素最大是很重要的,我假设这意味着您想要索引。 给定最大值后,可以很容易地找到另一个具有该值的元素(毕竟,通常情况下它可能不是唯一的),这可能是最简单的。 或者,您可以将索引本身编码为max调用:

>>> max((int(num), i) for i, num in enumerate(the_list[2::3]))
(45, 2)

它给出了max和3的索引组,并且起作用,因为元组按第一个元素排序,然后按第二个元素排序,依此类推。这种方法也不能处理非唯一的最大值。

不过,老实说,我可能会像@astynax一样重塑数据类型,但感觉这个列表不应该是平坦的。

>>> the_list = ['Order', '1', '5', 'Order', '2', '18', 'Order', '3', '45', 'Order', '4', '2', 'Order', '5', '8', 'Order', '6', '2', 'Order', '7', '1', 'Order', '8', '1', 'Order', '9', '1']
>>> items = zip(*[iter(the_list)] * 3)
>>> items
[('Order', '1', '5'), ('Order', '2', '18'), ('Order', '3', '45'), ('Order', '4', '2'),('Order', '5', '8'), ('Order', '6', '2'), ('Order', '7', '1'), ('Order', '8', '1'), ('Order', '9', '1')]    
>>> max(items, key=lambda x: int(x[2]))
('Order', '3', '45')
   >>> the_list = ['Order', '1', '5', 'Order', '2', '18', 'Order', '3', '45', 'Order', '4', '2', 'Order', '5', '8', 'Order', '6', '2', 'Order', '7', '1', 'Order', '8', '1', 'Order', '9', '1']
   >>> max(map(int,the_list[2::3]))
    45

这里[2::3]代表step ,即在“ 5”之后,它跳到“ 18”,然后跳到“ 45”,依此类推,每次跳3。 如果未提供,则step的默认值为1。 所以,

>>> the_list[2::3]
['5', '18', '45', '2', '8', '2', '1', '1', '1']

map()是一个函数,它将特定函数应用于iterable的每个对象,在此情况下为the_list[2::3] ,而应用的函数是int map()在python 2.x中返回一个列表,在python 3.x中返回map对象。

您可以尝试类似

my_max = max( [the_list[i] for i in range(len(the_list)) if (i+1)%3==0 ] )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM