Seite 1 von 1

mehrere max. Werte aus Liste auslesen?

Verfasst: Freitag 2. November 2007, 14:15
von Aquerias
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

Verfasst: Freitag 2. November 2007, 14:30
von lutz.horn
Was sind denn "die maximalen Werte 4, 6 und 8"? Ich verstehe Deine Frage nicht.

Z.B. so?

Verfasst: Freitag 2. November 2007, 14:32
von ws
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

Verfasst: Freitag 2. November 2007, 14:36
von lutz.horn
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.

Verfasst: Freitag 2. November 2007, 14:53
von ws
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()

Verfasst: Freitag 2. November 2007, 15:04
von lutz.horn
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]

Verfasst: Freitag 2. November 2007, 15:14
von Aquerias
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.

Verfasst: Freitag 2. November 2007, 15:27
von CM
Was spricht gegen die Anwendung von scipy und Differenzieren der Werte? So sollten sich lokale Maxima schnell & allgemein finden lassen.

Gruß,
Christian

Verfasst: Freitag 2. November 2007, 15:49
von Aquerias
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

Verfasst: Freitag 2. November 2007, 15:49
von 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))
:-)

Verfasst: Freitag 2. November 2007, 16:44
von CM
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

Verfasst: Samstag 3. November 2007, 00:50
von jordi

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.

Verfasst: Samstag 3. November 2007, 03:15
von 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.

Verfasst: Samstag 3. November 2007, 13:53
von jordi

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