Finden in liste...

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
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Hallo zusammen,

liste = [1, 2, 3, 5]

Nach dem Kriterium der aufsteigenden Reihenfolge fehlt die Zahl 4.
Wie kann ich diese ermitteln?

LG

rolgal_reloaded
CrackPod
User
Beiträge: 205
Registriert: Freitag 30. Juni 2006, 12:56

Hier mal eine kleine Lösung meinerseits :)

Code: Alles auswählen

#!/usr/bin/env python
#-*-encoding: utf-8 -*-

liste = [1, 2, 3, 5]
print liste
for i in range(max(liste)):
  if i in liste:
    print i,'ist in der Liste'
  else:
    liste.append(i)
    print i,'war nicht in der Liste, wurde aber eingefügt'
print sorted(liste)
LG
Zuletzt geändert von CrackPod am Donnerstag 26. April 2007, 21:57, insgesamt 1-mal geändert.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

rolgal_reloaded hat geschrieben:Nach dem Kriterium der aufsteigenden Reihenfolge fehlt die Zahl 4. Wie kann ich diese ermitteln?
Hallo rolgal_reloaded!

Da bis jetzt noch keiner geantwortet hat: Mit einer Referenzliste.

Code: Alles auswählen

>>> liste = [1, 2, 3, 5]
>>> for index, item in enumerate(range(1, len(liste) + 1)):
...     if liste[index] <> item:
...         print "Erstes fehlendes Element: %i" % i
...     
Erstes fehlendes Element: 4
>>> 
Allerdings glaube ich nicht, dass dir damit geholfen ist. Oder doch?

mfg
Gerold
:-)

Edit: 4 min. zu spät :-)

Edit: Ich hatte den falschen Code ins Forum kopiert. Das hier ist jetzt der richtige.

Code: Alles auswählen

>>> liste = [1, 2, 3, 5]
>>> for index, item in enumerate(range(1, len(liste) + 1)):
...     if liste[index] <> item:
...         print "Erstes fehlendes Element: %i" % item
...         break
...     
Erstes fehlendes Element: 4
>>>
Zuletzt geändert von gerold am Freitag 27. April 2007, 07:56, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BlackJack

Ich hätte noch das hier zu bieten:

Code: Alles auswählen

from itertools import count, ifilter, izip
from operator import itemgetter

def main():
    liste = [1, 2, 3, 5]
    print ifilter(itemgetter(1),
                  ((a, a - b) for a, b in izip(count(1), liste))).next()[0]
:-)
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

@all:

vielen Dank für die Beispiele, ich bin grad mal dabei alle für den entsprechenden Kontext zu probieren.

Liebe Grüße

rolgal_reloaded
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

gerold hat geschrieben:
rolgal_reloaded hat geschrieben:Nach dem Kriterium der aufsteigenden Reihenfolge fehlt die Zahl 4. Wie kann ich diese ermitteln?
Hallo rolgal_reloaded!

Da bis jetzt noch keiner geantwortet hat: Mit einer Referenzliste.

Code: Alles auswählen

>>> liste = [1, 2, 3, 5]
>>> for index, item in enumerate(range(1, len(liste) + 1)):
...     if liste[index] <> item:
...         print "Erstes fehlendes Element: %i" % i
...     
Erstes fehlendes Element: 4
>>> 
Allerdings glaube ich nicht, dass dir damit geholfen ist. Oder doch?

mfg
Gerold
:-)

Edit: 4 min. zu spät :-)
Ich glaube da funzt was nicht. i muss wohl item heissen, oder?
Ausserhalb der Zeichenkette, meine ich.

Beim Testen mit dieser Liste
[1, 2, 4, 5] bekam ich dieses Ergebnis:
Fehlendes Element: 3
Fehlendes Element: 4

4 fehlt aber nicht.

Irgendwas check ich da jetzt nicht.

LG

rolgal_reloaded
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

CrackPod hat geschrieben:Hier mal eine kleine Lösung meinerseits :)

Code: Alles auswählen

#!/usr/bin/env python
#-*-encoding: utf-8 -*-

liste = [1, 2, 3, 5]
print liste
for i in range(max(liste)):
  if i in liste:
    print i,'ist in der Liste'
  else:
    liste.append(i)
    print i,'war nicht in der Liste, wurde aber eingefügt'
print sorted(liste)
LG
Das könnte gut funktionieren für meine Zwecke, allerdings muss die Schleife für diese (Zwecke) so lauten - glaube ich:-)) :

Code: Alles auswählen

for i in range(1, max(liste)):
....
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

BlackJack hat geschrieben:Ich hätte noch das hier zu bieten:

Code: Alles auswählen

from itertools import count, ifilter, izip
from operator import itemgetter

def main():
    liste = [1, 2, 3, 5]
    print ifilter(itemgetter(1),
                  ((a, a - b) for a, b in izip(count(1), liste))).next()[0]
:-)
Hey BlackJack,

habe dich schon länger nicht mehr gesehen. Jetzt weiss ich warum!
Du wart auf einer Zeitreise und hast uns ein schönes Stück Code aus der Zukunft mitgebracht.

Irgendwie liest es sich so:-)) Megaspacig!

Wird deine Zeitmaschine eigentlich mit Python gesteuert

:D :?:

Liebe Grüße

rolgal_reloaded
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

BlackJack hat geschrieben:

Code: Alles auswählen

from itertools import count, ifilter, izip
from operator import itemgetter

def main():
    liste = [1, 2, 3, 5]
    print ifilter(itemgetter(1),
                  ((a, a - b) for a, b in izip(count(1), liste))).next()[0]
Hi BlackJack!

Da explodiert einem ja das Hirn, wenn man diesen Code liest. :shock: Ein Logikrätsel aus dem PM-Magazin ist leichter. 8)

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Wenn es nicht um die Reihenfolge geht, sondern nur darum, welche Zahlen in der Reihe fehlen, dann habe ich hier noch einen:

Code: Alles auswählen

>>> liste = [1, 2, 3, 5, 7]
>>> set1 = frozenset(liste)
>>> set2 = frozenset(xrange(1, max(liste) + 1))
>>> print set2.difference(set1)
frozenset([4, 6])
>>> 
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BlackJack

Okay, jetzt eine Lösung, die eine lineare Laufzeit hat, also nicht alle in Frage kommenden Zahlen mit ``in`` auf "enthalten sein" in der `liste` testet, die `liste` auch nur einmal durchläuft (kein `max()`) und auch keine Datenstruktur erzeugt, die alle in Frage kommenden Zahlen enthält:

Code: Alles auswählen

from itertools import count


def find_missing(iterable, expected_start=1):
    result = list()
    missing = 0
    for expected, number in izip(count(expected_start), iterable):
        diff = number - expected
        if diff != missing:
            result.extend(xrange(expected + missing, expected + diff))
            missing = diff
    return result


def main():
    liste = [2, 3, 5, 8, 9, 11]
    print find_missing(liste)   # -> [1, 4, 6, 7, 10]
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Das ist ein schönes Spiel für Programmierer. :-)

Ist euch schon mal in den Sinn gekommen, was andere "normale" Menschen über uns denken, wenn wir solche Dinge diskutieren? :wink:

Code: Alles auswählen

def find_missing(iterable, expected_start=1):
    diff = []
    expected = expected_start - 1
    for item in iterable:
        expected += 1
        if item == expected:
            continue
        for diff_item in xrange(expected, item):
            diff.append(diff_item)
            expected += 1
    
    return diff

liste = [2, 5, 10]
print find_missing(liste)   # -> [1, 3, 4, 6, 7, 8, 9]
lg
Gerold
:-)

Edit: An die Struktur von BlackJack angepasst
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BlackJack

Was meinst Du mit "normale" Menschen? Ich dachte *wir* sind normal und die anderen sind alle ein bisschen komisch!? ;-)
Antworten