2011-02-10 22 views
7

Mam problem z uzyskaniem najwyższej wartości w dynamicznej liście list krotek.
Lista może wyglądać następująco:Maksymalna wartość na liście list Tuple

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

teraz pętlę poprzez listy, aby uzyskać najwyższą jakość (całkowity):

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, ..} 

Próbowałem wiele, aby uzyskać maksymalną wartość, ale znalazłem bez wniosku o mój problem. Wiem, że muszę przechodzić przez każdy Tuple na liście i porównywać go z następnym, ale nie wiem, jak to zakodować.

Mogę również użyć funkcji max(), ale nie działa z ciągami i liczbami całkowitymi. f.e. a = [ ('a',5),('z',1)] -> wynikiem jest max(a) ---> ('z',1) obv 5> 1, ale z> a więc próbowałem rozszerzyć funkcję max z max(a, key=int), ale pojawia się błąd typu.

Spodziewać się można zrozumieć, co chcę ;-)

UPDATE

Dzięki tej pory.

Jeśli użyć itertools.chain(*adymlist) i max(flatlist, key=lambda x: x[1])
będę się wyjątek jak: max_word = max (flatlist, klucz = N x: x [1]) Błąd typu: 'int' obiekt jest unsubscriptable

ale jeśli użyj itertools.chain(adymlist) działa dobrze. Ale nie wiem, jak podsumować wszystkie liczby całkowite z każdej krotki listy. Potrzebuję twojej pomocy, aby to zrozumieć.

W przeciwnym razie napisałem obejście dla itertools.chain(*adymlist), aby uzyskać sumę wszystkich liczb całkowitych i najwyższą liczbę całkowitą na tej liście.

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] 

Nadal robi to, co chcę, ale czy nie jest brudny?

Odpowiedz

16

Aby wyjaśnić, wygląda na to, że masz listę list krotek. To nie wygląda jak dbamy o co lista są one, więc możemy uprościć to do dwóch etapów

  • spłaszczyć listę list z listą krotek
  • Znajdź wartość max

pierwsza część może być osiągnięte poprzez itertools.chain (patrz np Flattening a shallow list in Python)

Drugim może być rozwiązany przez max, masz rację, ale trzeba być przechodzącą w funkcji zamiast typu chcesz. Ta funkcja musi zwrócić wartość już wprowadzonego na, w tym przypadku, drugą część krotki

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

Korekta

ja ponownie przeczytać pytanie - szukasz max wartość w każdej podlistrze? W takim przypadku zastosowanie ma tylko druga część.Po prostu iteracyjne nad listy dla każdej listy

Nieco bardziej pythonic niż to, co masz aktualnie chciałby

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

lub

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

Jak spintheblack mówi, masz listę list krotki . Zakładam, że szukasz najwyższej wartości całkowitej wszystkich krotek.

Można iteracyjne nad listą zewnętrznej, a następnie nad listą krotek krotki tak:

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 

To jest trochę bardziej rozwlekły, ale może być łatwiejsze do zrozumienia.

Powiązane problemy