2012-06-24 57 views
1

我正在使用Python 3.2.3,並希望從列表中的特定元素中找到最大數字。我保留一些關於哪個元素是最大數量的知識也很重要,但是在這種情況發生的時候非常靈活。讓我來解釋......從Python中選擇列表中查找最大數字

背景

我有以下列表:

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'] 

每三個列表中的元素,前兩個是描述性的數據 - 即「訂單1「,」訂單2「,」訂單3「爲」訂單「,」1「,...,」訂單「,」2「,...,」訂單「,」3「,...一路到「9號」。這些不會更改,並提供每個第三個列表元素的來源或名稱。

每三個列表元素中的第三個是有問題的信息。在這個例子中,數字是5 ... 18 ... 45 ... 2 ...等等。從這個每隔第三個元素,我想找到最大的數字。在這種情況下,最大的數字是45.這些數字總是在變化;它們可以是從0到100 [包括]的任何整數。

我已經試過到目前爲止

我一直在使用Python的MAX()函數在兩個方面嘗試。首先,簡單地...

max(the_list) 

...它提供「Order」作爲最大值。對我的目標很失望。

所以我決定嘗試製作一個新的列表,只包括原始列表的每個第三個元素。像這樣...

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個第3個列表元素。這是一個數字,但不是最高的45 [在這個例子中]。

我也嘗試過製作一系列if-else語句,但都不成功,而且在思維定勢中必須有更多pythonic //優雅的方式。我承認,我可能在這條路線上放棄得太早,或者我的思維方式錯誤。

回答

7

像這樣的東西應該工作:

>>> 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的slice notation讓每一個第三(這是3)開始元素#2(這是2)元素,用the_list[2::3]

儘管如此,這還不夠,因爲the_list的條目是字符串,它們按字典順序排序,而不是數字排序。這就是爲什麼我必須在每個條款上撥打int(num),並通過max a generator expression,這裏的格式爲'(someseq for elem)'。

你也可以說跟蹤哪個元素是最大的,這點我認爲你的意思是你想要索引是很重要的。鑑於最大值,很容易找到哪些元素具有它(通常情況下,它可能不是唯一的),使用另一種搜索匹配它的元素(這可能是最簡單的)。另外,您也可以在指數本身編碼爲max電話:

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

這給最大和組的三個指數,和工作,因爲元組是由第一個元素進行排序,然後第二個,等等。這種方法也不能處理非唯一的最大值。

說實話,雖然我可能會通過重塑樣的數據像@astynax did--它不覺得這個名單應該是平的開始。

+0

非常感謝您!我可能應該嘗試重新塑造數據,但現在最後一個,但它提供(45,2)將是非常好的。 – MilesNielsen

0

你可以嘗試像

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

對我來說,這返回'8',這不是我們正在尋找的答案。另外,不需要通過方括號創建列表:您可以直接將生成器表達式傳遞給max。 –

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'] 
    >>> max(map(int,the_list[2::3])) 
    45 

這裏3 [2::3]代表step,即 '5' 它跳到 '18',然後爲 '45',等等,服用後每次跳3次。如果未提供,則默認值爲step。 所以,

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

地圖()是施加一個特定的功能,以可迭代的每個對象,在這種情況下是the_list[2::3]和所應用的功能是int的函數。 map()返回python 2.x中的列表以及python 3.x中的映射對象。

5
>>> 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') 
+0

我發現這也適用於我,並將在我的進一步腳本開發中包含此方法。非常整潔的解決方案,謝謝:) – MilesNielsen

相關問題