2011-02-10 42 views
7

我有一個問題,在元組列表的動態列表中獲得最高值。
的可列表如下:元組列表中的最大值

adymlist = [[('name1',1)],[('name2',2),('name3',1), ...('name10', 20)], ...,[('name m',int),..]] 

現在我遍歷列表,以獲得最高值(整數):

total = {} 
y=0 
while y < len(adymlist): 
    if len(adymlist) == 1: 
     #has the List only 1 Element -> save it in total 
     total[adymlist[y][0][0]] = adymlist[y][0][1] 
     y += 1 
    else: 
     # here is the problem 
     # iterate through each lists to get the highest Value 
     # and you dont know how long this list can be 
     # safe the highest Value in total f.e. total = {'name1':1,'name10':20, ..} 

我嘗試了很多,以獲得最大的價值,但我發現對我的問題沒有結論。我知道我必須遍歷列表中的每個元組,並將其與下一個元組進行比較,但它不知道如何對它進行正確編碼。

另外我可以使用函數max(),但它不適用於字符串和整數。 F.E. a = [ ('a',5),('z',1)] - >結果是max(a) ---> ('z',1) obv 5> 1但z> a所以我試圖擴大與max(a, key=int)最大功能,但我得到一個類型錯誤。

希望你能明白我想;-)

UPDATE

感謝這麼遠。

如果我使用itertools.chain(*adymlist)max(flatlist, key=lambda x: x[1])
我會得到這樣的異常:max_word = MAX(flatlist,鍵=拉姆達X:X [1]) 類型錯誤: 'INT' 目的是unsubscriptable

但是,如果我使用itertools.chain(adymlist)它工作正常。但是我不知道如何總結列表中的每個元組的所有整數。我需要你的幫助來弄明白。

否則,我爲itertools.chain(*adymlist)寫了一個解決方法,以獲得該列表中所有整數和最高整數的總和。

chain = itertools.chain(*adymlist) 
flatlist = list(chain) 
# flatlist = string, integer, string, integer, ... 
max_count = max(flatlist[1:len(flatlist):2]) 
total_count = sum(flatlist[1:len(flatlist):2]) 
# index of highest integer 
idx = flatlist.index(next((n for n in flatlist if n == max_count))) 
max_keyword = flatlist[idx-1] 

它仍然做我想要的東西,但它不是骯髒?

回答

16

爲了澄清,看起來像你有一個元組列表的列表。它看起來並不像我們所關心的,他們是在什麼名單,所以我們可以簡化這兩個步驟

  • 拼合列出的清單元組的列表
  • 查找最大值

第一部分可以通過itertools.chain(參見例如Flattening a shallow list in Python

第二個能夠通過最大可以解決來完成,你有正確的想法,但你應該傳遞一個函數,而不是你想要的類型。此功能需要回到你鍵入的值,在這種情況下,元組的第二部分

max(flatlist, key=lambda x: x[1]) 

修正

我重讀你的問題 - 你在找最大每個子列表中的值?如果是這種情況,那麼只有第二部分是適用的。只需在您的列表遍歷每個列表

有點比你現在有更Python想

output = [] 
for lst in lists: 
    output.append(max(flatlist, key=lambda x: x[1])) 

map(lambda x: max(x, key=lambda y: y[1]) , lists) 
4

由於spintheblack說,你有元組的列表清單。我認爲你正在尋找所有元組的最高整數值。

可以遍歷外列表中,然後在元組的元組這樣的名單:

max_so_far = 0 
for list in adymlist: 
    for t in list: 
    if t[1] > max_so_far: 
     max_so_far = t[1] 
print max_so_far 

這是一個有點冗長,但可能會更容易理解。