Python - prüfen ob Liste ein einer anderen Liste ist

OP #5568547
Lesenswert?

Hallo Zusammen,

ich habe eine Liste voller Tupel. Jetzt möchte ich prüfen, ob eine 
zweite (kleinere) Liste in der ersten Liste vorhanden ist.

Beispiel:
1
liste1 = [(1, 0), (0, 0), (0, 1), (1, 1), (0, 1), (0, 0), (1, 1), (1, 1), (0, 0), (1, 0), (0, 0), (1, 0), (0, 1), (1, 1)] 
2

3
liste2 =  [(0, 1), (1, 1), (0, 1)]

Gibt es eine Möglichkeit herauszufinden ob liste2 in liste1 enthalten 
ist, ohne die ganze Liste in Schleifen zu durchlaufen. Also sowas wie 
ein  regulärer Ausdruck oder ähnliches?


Danke im voraus.
Mopzhk
OP #5568564
Lesenswert?

Hallo Schlange,
danke für deine Antwort.

Schlange schrieb:
> if list2 in list1:

Das hab ich auch schon getestet:
1
data = []
2
status =[]
3
on = (1,0)
4
off = (1,1)
5
i = 0
6

7
while i != 2:
8
  i += 1
9
  status.append(on)
10
  status.append(off)
11
  
12
i = 0  
13
while i != 10:
14
  i += 1
15
  data.append(on)
16
  data.append(off)
17
  
18
if status in data:
19
  print("Gefunden")
20
else:
21
  print("nicht Gefunden")

jedoch mit dem Ergebnis "nicht Gefunden".

Gruß Mophzk
Moderator #5568577
Lesenswert?

Eine Funktion, die prüft, ob eine Liste eine Teilliste einer anderen
Liste ist, gibt es in Python und seiner Standardbibliothek m.W. nicht.

Es bleibt also wohl nichts anderes übrig, als eine entsprechende
Funktion selber zu schreiben.

Der in-Operator prüft, ob der linke Operand ein Element des rechten
Operanden ist, also bspw.

1
  [2,3] in [[1,2], [2,3], [3,4]] -> True

Das ist aber nicht, wonach du suchst.
Gast #5568580
Lesenswert?

Mit Vorbehalt, denn ich bin nicht umfassend erfahren in Python.

Also, geht man Python 3.7 aus (und vermutlich verhalten sich frühere 
Versionen genau so), dann prüft der "in" Operator, ob sich ein Objekt 
in einer Liste befindet. 
https://docs.python.org/3/reference/expressions.html#membership-test-operations

Man wird das, vermute ich, selber implementieren müssen. Ist aber auch 
nicht schwierig, denke ich, wenn man auf die Ausführungsgeschwindigkeit 
nicht all zu viel Wert legt. Aber eine Suche nach einer fertigen 
Funktion mag sich lohnen.
Gast #5568618
Lesenswert?

Theor schrieb:

> Man wird das, vermute ich, selber implementieren müssen.
> Ist aber auch nicht schwierig, denke ich, wenn man auf
> die Ausführungsgeschwindigkeit nicht all zu viel Wert
> legt.

Wenn die Listen sortiert sind, genügt ein Durchlauf der
längeren Liste.
Falls sie nicht sortiert sind, gibt es bestimmt eine
einigermaßen effiziente Sortierroutine als Standard-
funktion.
Gast #5568639
Lesenswert?

M. H. schrieb:
> Gibt es eine Möglichkeit herauszufinden ob liste2 in liste1 enthalten
> ist, ohne die ganze Liste in Schleifen zu durchlaufen.

Zuerst musst du einmal genau definieren was mit "liste2 in liste1" 
gemeint ist.
Aus dem Rest deines 1. Beitrags und dem 2. gehe ich davon aus du meinst 
"Elemente aus liste2 in liste1", liste2 ist also keine Liste aus Listen. 
Weitere Fragen:
-Ist die Position in liste2 relevant, also sowas wie Reihenfolge?
-Was ist wenn Elemente in liste1 mehrfach vorkommen? Müssen dann auch 
mehrere in liste2 vorhanden sein?
-Sind die Elemente tatsächlich Integer-Tuple, oder ist dein Quelltext 
ein Beispiel? Wenn es nur ein Beispiel ist, lassen sich die Elemente 
sortieren?
Gast #5568651
Lesenswert?

Das set ist dein freund es hat eine issubset Funktion die das macht was 
du willst. folgender Code sollte "Sublist found" ausgeben. Das 
Konvertieren der beiden listen in ein Set macht Python für dich.
1
 list1 = [(1, 0), (0, 0), (0, 1), (1, 1), (0, 1), (0, 0), (1, 1), (1, 1), (0, 0), (1, 0), (0, 0), (1, 0), (0, 1), (1, 1)] 
2
 list2 = [(0, 1), (1, 1), (0, 1)]
3

4
 if set(list2).issubset(list1): 
5
    print('Sublist found')
6
 else:
7
    print('not found')
Gast #5568653
Lesenswert?

Egon D. schrieb:
> Theor schrieb:
>
>> Man wird das, vermute ich, selber implementieren müssen.
>> Ist aber auch nicht schwierig, denke ich, wenn man auf
>> die Ausführungsgeschwindigkeit nicht all zu viel Wert
>> legt.
>
> Wenn die Listen sortiert sind, genügt ein Durchlauf der
> längeren Liste.
> Falls sie nicht sortiert sind, gibt es bestimmt eine
> einigermaßen effiziente Sortierroutine als Standard-
> funktion.

Es ist natürlich nur eine Vermutung, aber ich gehe davon aus, dass die 
Abfolge der Elemente in beiden Listen eine Rolle spielt, weil

1. der TO die Listen nicht sortiert hat und
2. Elemente mehrfach vorkommen und
3. der TO mit dem Wort "in" das "Enthaltensein" einer Liste in einer 
anderen assoziiert (in seinem Beitrag) anstelle des Enthaltenseins der 
Elemente der Liste oder des enthaltenseins einer Liste in einer Liste 
von Listen. (Das kann natürlich auch ein fehlgeschlagener Versuch des 
prägnanten Ausdrucks sein).

Insofern, gehe ich davon aus, dass die Listen auf keinen Fall sortiert 
sein sollen.
Andernfalls hast Du natürlich durchaus recht, diesen Aspekt zu nennen.
Aber danach hat ja noch jemand gefragt. Mal abwarten.
OP #5568664
Lesenswert?

Theor schrieb:

> Es ist natürlich nur eine Vermutung, aber ich gehe davon aus, dass die
> Abfolge der Elemente in beiden Listen eine Rolle spielt, weil

Das ist richtig.

Die einfachste Lösung für ich war es die beiden Listen in Strings zu 
schreiben und dann mit
1
if liste2 in liste1:

zu überprüfen.

Aber Danke für eure Hilfe. Sollte ich die Zeit finden, werde ich mich 
nach einer eleganteren Möglichkeit umsehen.

Grüße Mophzk
Gast #5568670
Lesenswert?

Theor schrieb:

> 1. der TO die Listen nicht sortiert hat und
> 2. Elemente mehrfach vorkommen und
> 3. der TO mit dem Wort "in" das "Enthaltensein" einer
> Liste in einer anderen assoziiert (in seinem Beitrag)
> anstelle des Enthaltenseins der Elemente der Liste
> oder des enthaltenseins einer Liste in einer Liste von
> Listen. (Das kann natürlich auch ein fehlgeschlagener
> Versuch des prägnanten Ausdrucks sein).

Ach so. Ich hatte "...ist ... in ... enthalten" als
TeilMENGENbeziehung aufgefasst.

Wenn ich Dich richtig verstehe, wollte der TO aber
wissen, ob Liste2 eine TeilLISTE von Liste1 ist, also
ob Liste1 in der Form "Präfixliste Liste2 Suffixliste"
darstellbar ist.

Das habe ich dann missverstanden. Entschuldigung.
#5569094
Lesenswert?

Wäre das eventuell eine mögliche Lösung der Aufgabenstellung:
1
list1 = [(1, 0), (0, 0), (0, 1), (1, 1), (0, 1), (0, 0), (1, 1), (1, 1), (0, 0), (1, 0), (0, 0), (1, 0), (0, 1), (1, 1)]
2
list2 =  [(0, 1), (1, 1), (0, 1)]
3

4
n_elements = len(list2)
5

6
for i in range(len(list1) - n_elements):
7
    if list1[i:i + n_elements] == list2:
8
        print('Found at index {0}...'.format(i))
9
        break
10
else:
11
    print('Not found...')

Viele Grüße
Falk

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren