Вот мой вариант:
def hasnocc(str):
for i in xrange(1, len(str)):
if str[i-1] == str[i]:
return False
return True
>> print filter(hasnocc, ["fffds", "bla-bla", "fffdj", "fffdk", "fffdl", "fffjj", "fffjk", "fffjl", "123"])
>> ['bla-bla', '123']
def hasnocc(str):
for i in xrange(1, len(str)):
if str[i-1] == str[i]:
return False
return True
>> print filter(hasnocc, ["fffds", "bla-bla", "fffdj", "fffdk", "fffdl", "fffjj", "fffjk", "fffjl", "123"])
>> ['bla-bla', '123']
# ...
for a, b in itertools.izip(str[:-1], str[1:]):
if a == b:
return False
# ...
from timeit import Timer
init = 'lst = ["1", "fffds", "bla-bla", "fffdj", "fffdk", "fffdl", "fffjj", "fffjk", "fffjl", "123"]'
init1 = """
from itertools import imap, izip
""" + init
init2 = """
def ifd(str):
for i in xrange(1, len(str)):
if str[i-1] == str[i]:
return False
return True
""" + init
init3 = """
def ifd(str):
for a,b in itertools.izip(str[:-1], str[1:]):
if a == b:
return False
return True
""" + init
print Timer('list((x for x in lst if 1 not in imap(len, imap(set, izip(x[1:], x[:-1])))))', init1).timeit(number=10000)
print Timer('filter(ifd, lst)', init2).timeit(number=10000)
print Timer('filter(ifd, lst)', init3).timeit(number=10000)
import random
import timeit
l = [random.randint(0, 255) for i in xrange(10000)]
print timeit.Timer('''for a, b in itertools.izip(l, itertools.islice(l, 1, None)):
if a == b:
break''', 'import itertools; l = %r'%l).timeit(number = 10000)
print timeit.Timer('''for i in xrange(1, len(l)):
if l[i - 1] == l[i]:
break''', 'l = %r'%l).timeit(number = 10000)
from timeit import Timer
from random import randrange
lst = [str(randrange(0, 255)) for i in xrange(10000)]
init = 'lst = %s' % str(lst)
init1 = """
def ifd(str):
for i in xrange(1, len(str)):
if str[i-1] == str[i]:
return False
return True
""" + init
init2 = """
import itertools
def ifd(str):
for a,b in itertools.izip(str[:-1], str[1:]):
if a == b:
return False
return True
""" + init
print Timer('filter(ifd, lst)', init1).timeit(number=100)
print Timer('filter(ifd, lst)', init2).timeit(number=100)
init3 = """
def foo(lst):
for item in lst:
for i in xrange(1, len(item)):
if item[i-1] == item[i]:
break
else:
yield(item)
""" + init
print Timer('filter(ifd, lst)', init1).timeit(number=100)
print Timer('list(foo(lst))', init3).timeit(number=100)