mehrere max. Werte aus Liste auslesen?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Aquerias
User
Beiträge: 28
Registriert: Freitag 28. September 2007, 10:33

Hallo,

ich habe folgendes Problem und leider keinen passenden Eintrag gefunden.

Ich habe eine Liste die so aussieht:

ListeA = [1, 2, 3, 4, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8 ]

Meine Frage: Wie bekomme ich aus der Liste die maximalen Werte 4, 6 und 8?

Ich habe das ganze schon mit einer Schleife probiert hat aber nicht funktioniert.

Code: Alles auswählen

for row in ListeA[0::]:
 	C = List[0] > List[1]
 	if C == 'True':
 		print List[0]
Gruß Aquerias
Benutzeravatar
lutz.horn
User
Beiträge: 205
Registriert: Dienstag 8. November 2005, 12:57
Wohnort: Pforzheim

Was sind denn "die maximalen Werte 4, 6 und 8"? Ich verstehe Deine Frage nicht.
ws
User
Beiträge: 65
Registriert: Freitag 16. Juni 2006, 13:19

Ist vielleicht nicht die schnellste Lösung, funktioniert aber erstmal ...

Code: Alles auswählen

ListeA = [1, 2, 3, 4, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8 ] 


# eliminate doubles

newList = []
map(lambda x: x not in newList and newList.append(x), ListeA)
newList.sort()

# store the max. Elements in maxVals

maxVals = newList[-3:]

Gruss

Wolfgang
Benutzeravatar
lutz.horn
User
Beiträge: 205
Registriert: Dienstag 8. November 2005, 12:57
Wohnort: Pforzheim

Falls Du die drei größten Werte ohne Dupletten möchtest, ginge etwas in dieser Art:

Code: Alles auswählen

a = [1, 2, 3, 4, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8 ] 
b = list(set(a))
b.sort()
print b[-3:]
Keine Ahnung, ob Du das meinst.
ws
User
Beiträge: 65
Registriert: Freitag 16. Juni 2006, 13:19

Anscheinend meint er die jeweiligen Maxima der aufsteigenden Teilsequenzen. Dazu müsste man die Teilsequenzen ermitteln und deren Maximalwerte nehmen:

Code: Alles auswählen

ListeA = [1, 2, 3, 4, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8 ] 

ascendingLists = []
lastElem = None
lastList = None
for elem in ListeA:
    print elem
    if (not lastElem) or elem < lastElem:
        lastList = currentList
        currentList = [elem]
        if lastList:
            ascendingLists.append(lastList)
    else:
        currentList.append(elem)
    lastElem = elem
    print currentList

maxVals = map(lambda x: x[-1], ascendingLists)
maxVals.sort()
Benutzeravatar
lutz.horn
User
Beiträge: 205
Registriert: Dienstag 8. November 2005, 12:57
Wohnort: Pforzheim

Wie wäre es hiermit:

Code: Alles auswählen

endpoints = []
prev = -1 # falls x > 0 für alle x aus a
for elem in a:
    if elem < prev:
        endpoints.append(prev)
    prev = elem
endpoints.append(prev)
print endpoints
# [4, 6, 8]
Aquerias
User
Beiträge: 28
Registriert: Freitag 28. September 2007, 10:33

Hallo,

danke für die Antworten. Ich habe beide Vorschläge ausprobiert und die Zahlen 30, 31, 32 herausbekommen. Die wollte ich allerdings nicht.

In der Liste stehen doch Zahlen in einer bestimmten Reihenfolge.

a = [1, 2, 3, 4, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8 ]

Würde man die Liste in die einzelnen Reihenfolgen zerlegen würde das ganze so aussehen:

Reihenfolge A: 1, 2, 3, 4
Reihenfolge B: 1, 2, 3, 4, 5, 6
Reihenfolge C: 1, 2, 3, 4, 5, 6, 7, 8

Von diesen Zahlenfolgen möchte ich jeweils den größten Wert, also 4, 6 und 8.

Würde das ganze in einzelnen Listen stehen könnte ich mit max() den größten Wert ermitteln.
Da aber alles in einer Liste steht funktioniert max() nicht, da würde ja nur 8 rauskommen.
Mein Versuch mit der Schleife und der Bedingung < oder > als hat leider nicht funktioniert.

Ich hoffe mein Problem ist jetzt etwas deutlicher geworden.

gruß Aquerias

SORRY habe die neuen Einträge noch nicht gelesen.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Was spricht gegen die Anwendung von scipy und Differenzieren der Werte? So sollten sich lokale Maxima schnell & allgemein finden lassen.

Gruß,
Christian
Aquerias
User
Beiträge: 28
Registriert: Freitag 28. September 2007, 10:33

Hallo CM,

tut mir leid, Deinen Beitrag verstehe ich nicht ganz. Wer oder was ist scipy? In meinem Python Buch finde ich jedenfalls nichts darüber.

Die Lösung von lutz.horn funktioniert wunderbar und liefert mir genau die Werte die ich brauche. Falls es aber noch andere Lösungsmöglichkeiten gibt, kein Problem ich bin für alles offen.

Vielen Dank nochmals.

Aquerias
BlackJack

Code: Alles auswählen

from itertools import count, groupby, izip

def iter_max_values(iterable):
    for dummy, seq in groupby(izip(iterable, count()), lambda (a, b): a - b):
        for item in seq:
            pass
        yield item[0]

def main():
    items = [1, 2, 3, 4, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8]
    print list(iter_max_values(items))
:-)
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Aquerias hat geschrieben:tut mir leid, Deinen Beitrag verstehe ich nicht ganz. Wer oder was ist scipy? In meinem Python Buch finde ich jedenfalls nichts darüber.

Die Lösung von lutz.horn funktioniert wunderbar und liefert mir genau die Werte die ich brauche. Falls es aber noch andere Lösungsmöglichkeiten gibt, kein Problem ich bin für alles offen.
Sorry, ich dachte Du hast irgendwelche (!) Werte und wolltest lokale Maxima finden. Deine Werte haben aber offenbar eine Ordnung. Solange Du nicht davon abweichst, kein Problem.

Ansonsten: www.scipy.org - aber das führt hier zu nirgendwo hin.

Gruß,
Christian
jordi
User
Beiträge: 7
Registriert: Sonntag 14. Oktober 2007, 19:07
Kontaktdaten:

Code: Alles auswählen

items = [1,2,3,4,1,2,3,4,5,6,1,2,3,4,5,6,7,8 ]
container = [ [], [], [] ]

i = -1
for item in items:
    if item == 1:
        i+=1
    container[i].append(item)

for i in container:
    print max(i)
ist nicht optimal weil es 1 öfters hinzufügt als es soll, aber gibt zumindest 4, 6, 8 aus.
BlackJack

Na dass kann man auch einfacher haben:

Code: Alles auswählen

print [4, 6, 8]
Mal ernsthaft: bei Deiner Lösung muss man ja schon vorher wissen das es genau drei solcher aufsteigender Teilsequenzen gibt.
jordi
User
Beiträge: 7
Registriert: Sonntag 14. Oktober 2007, 19:07
Kontaktdaten:

Code: Alles auswählen

items = [1,2,3,4,1,2,3,4,5,6,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,9,10]
>>> def foo(items):
...     i = -1
...     container = {}
...     for item in items:
...             if item == 1:
...                     i+=1
...             container[i] = item
...     return container.values()
... 
>>> foo(items)
[4, 6, 8, 10]
War wohl gestern schon zu müde. Fragt sich natürlich noch ob die Listen auch immer schön mit 1en beginnen, sonst bringt die Lösung so auch nix...
Antworten