Code: Alles auswählen
>>> "baum" in "baumhaus"
True
>>> [3,4] in [1,2,3,4,5]
False
>>>Code: Alles auswählen
>>> "baum" in "baumhaus"
True
>>> [3,4] in [1,2,3,4,5]
False
>>>Code: Alles auswählen
>>> {3, 4} < {1, 2, 3, 4, 5}
TrueCode: Alles auswählen
from collections import Sequence
def contains_sequence(seq, subseq):
if not isinstance(seq, Sequence) or not isinstance(subseq, Sequence):
raise TypeError('seq and subseq must be sequences')
if not subseq:
return True
try:
i = seq.index(subseq[0])
except ValueError:
# subseq[0] not in seq
return False
stop = i + len(subseq)
if not isinstance(subseq, type(seq)):
# Different types are never equal
subseq = type(seq)(subseq)
return seq[i:stop] == subseqCode: Alles auswählen
from collections import Sequence
def contains_sequence(seq, subseq):
if not isinstance(seq, Sequence) or not isinstance(subseq, Sequence):
raise TypeError('seq and subseq must be sequences')
if not subseq:
return True
if not isinstance(subseq, type(seq)):
subseq = type(seq)(subseq)
start = 0
while True:
try:
start = seq.index(subseq[0], start)
except ValueError:
return False
stop = start + len(subseq)
if seq[start:stop] == subseq:
return True
start += 1Code: Alles auswählen
def startswith_sequence(sequence, subsequence):
return sequence[:len(subsequence)] == subsequence
def contains_sequence(sequence, subsequence):
return any(
startswith_sequence(sequence[i:], subsequence)
for i in range(len(sequence) - len(subsequence) + 1)
)Code: Alles auswählen
def iter_candidates(seq, subseq):
sublen = len(subseq)
start = 0
while True:
try:
start = seq.index(subseq[0], start)
except ValueError:
return
yield (start, start + sublen)
start += 1
def contains_sequence(seq, subseq):
if not subseq:
return True
return any(
seq[start:stop] == subseq
for start, stop in iter_candidates(seq, subseq)
)Code: Alles auswählen
def iter_candidates(seq, subseq):
for i, item in enumerate(seq):
if item == subseq[0]:
yield i
def contains_sequence(seq, subseq):
if not subseq:
return True
if len(subseq) > len(seq):
return False
for start in iter_candidates(seq, subseq):
for i, subitem in enumerate(subseq):
if seq[start + i] != subitem:
break
else:
return True
return FalseCode: Alles auswählen
def contains_sequence(seq, subseq, start=0):
if not subseq:
return True
if len(subseq) > len(seq):
return False
while True:
try:
start = seq.index(subseq[0], start)
except ValueError:
return False
if all(seq[start + i] == subitem for i, subitem in enumerate(subseq)):
return True
start += 1Code: Alles auswählen
stop = start + len(subseq)
if seq[start:stop] == subseq:
return True
start += 1Sowohl auf `list` als auch auf `tuple`, finde ich. Da kann man jetzt entweder an beiden APIs Änderungen vornehmen oder `containsAll()` als allgemeine Funktion schreiben und diese z.B. über das `operator`-Modul anbieten. Ich habe mal zum Spaß etwas auf Basis des `PySequence`-Protokolls geschrieben. Ich werde das noch ein bißchen ausarbeiten und stelle es vielleicht dann in ein paar Tagen als Verbesserungsvorschlag vor.BlackJack hat geschrieben:Das ist einfach etwas was in C programmiert sein sollte wenn's effizient sein soll und IMHO eine Methode auf `list` sein sollte.
Code: Alles auswählen
def ist_teilliste(kleine_liste, grosse_liste):
if len(kleine_liste) > len(grosse_liste): return False
if grosse_liste[:len(kleine_liste)] == kleine_liste: return True
return ist_teilliste(kleine_liste[1:], grosse_liste)Code: Alles auswählen
#!/usr/bin/env python3
from collections import deque
from itertools import chain, islice
def dropuntil(iterable, needle):
"""
Advance `iterable` until a sequence with all items of `needle` (with
respect to their order) is found. Then yield all remaining items
starting with the first item of `needle`. Yield nothing if `iterable`
does not contain the given needle.
"""
iterator = iter(iterable)
window = deque(maxlen=len(needle))
window.extend(islice(iterator, len(needle)))
if len(window) == len(needle):
while any(a != b for a, b in zip(window, needle)):
try:
window.append(next(iterator))
except StopIteration:
return
yield from chain(window, iterator)
def main():
print(list(dropuntil([1,2,9,3,4,3,5,2,3,4,2,3], [2,3])))
print(list(dropuntil([1,2,9,3,4,3,5,2,3,4,2,3], [8,9])))
print(''.join(dropuntil('xxxhamyyyspamzzzeggs', 'spam')))
if __name__ == '__main__':
main()