Seite 1 von 1
Finden in liste...
Verfasst: Donnerstag 26. April 2007, 19:16
von rolgal_reloaded
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
Verfasst: Donnerstag 26. April 2007, 21:52
von CrackPod
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
Re: Finden in liste...
Verfasst: Donnerstag 26. April 2007, 21:56
von gerold
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
>>>
Verfasst: Freitag 27. April 2007, 00:01
von 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]

Verfasst: Freitag 27. April 2007, 00:03
von rolgal_reloaded
@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
Re: Finden in liste...
Verfasst: Freitag 27. April 2007, 00:22
von rolgal_reloaded
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
Verfasst: Freitag 27. April 2007, 00:28
von rolgal_reloaded
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:-)) :
Verfasst: Freitag 27. April 2007, 00:32
von rolgal_reloaded
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
Liebe Grüße
rolgal_reloaded
Verfasst: Freitag 27. April 2007, 08:03
von gerold
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.

Ein Logikrätsel aus dem PM-Magazin ist leichter.
lg
Gerold

Verfasst: Freitag 27. April 2007, 08:12
von gerold
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

Verfasst: Freitag 27. April 2007, 09:22
von 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]
Verfasst: Freitag 27. April 2007, 09:47
von gerold
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?
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
Verfasst: Freitag 27. April 2007, 11:06
von BlackJack
Was meinst Du mit "normale" Menschen? Ich dachte *wir* sind normal und die anderen sind alle ein bisschen komisch!?
