[英]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.