import timeit
s = """
import collections
import itertools
def JonClements(iterable):
i = iter(iterable)
return any(i) and not any(i)
def only_n(l, testval=True, coerce=bool, n=1):
counts = collections.Counter()
def iterate_and_count():
for x in itertools.imap(coerce,l):
yield x
if x == testval and counts[testval] > n:
break
counts.update(iterate_and_count())
return counts[testval] == n
def only_truthy(l, n=1):
counts = collections.Counter()
def iterate_and_count():
for x in l:
if x:
yield True
if counts[True] > n: break
else: yield False
counts.update(iterate_and_count())
return counts[True] == n
def only_truthy_fixed(l, n=1):
tcount = 0
for x in l:
if x:
tcount += 1
if tcount > n: return False
return tcount == n
def nisanh(iterable, n=1, m=1):
i = iter(iterable)
return m <= sum(any(i) for x in xrange(n+1)) <= n
"""
def nisanh(iterable, n=1, m=1):
i = iter(iterable)
return list(any(i) for x in xrange(n+1))
print nisanh([2,3,None])
print nisanh([None,3,None])
def JonClements(iterable):
i = iter(iterable)
return any(i) and not any(i)
print JonClements([2,3,None])
print JonClements([None,3,None])
number = 500
truelist = "l=[True]*10000"
falselist = "l=[False]*10000"
print timeit.timeit("only_n(l)", s+truelist, number=number)
print timeit.timeit("only_n(l)", s+falselist, number=number)
print timeit.timeit("only_truthy(l)", s+truelist, number=number)
print timeit.timeit("only_truthy(l)", s+falselist, number=number)
print timeit.timeit("only_truthy_fixed(l)", s+truelist, number=number)
print timeit.timeit("only_truthy_fixed(l)", s+falselist, number=number)
print timeit.timeit("JonClements(l)", s+truelist, number=number)
print timeit.timeit("JonClements(l)", s+falselist, number=number)
print timeit.timeit("nisanh(l)", s+truelist, number=number)
print timeit.timeit("nisanh(l)", s+falselist, number=number)
aW1wb3J0IHRpbWVpdAoKcyA9ICIiIgppbXBvcnQgY29sbGVjdGlvbnMKaW1wb3J0IGl0ZXJ0b29scwpkZWYgSm9uQ2xlbWVudHMoaXRlcmFibGUpOgogICAgaSA9IGl0ZXIoaXRlcmFibGUpCiAgICByZXR1cm4gYW55KGkpIGFuZCBub3QgYW55KGkpCgoKZGVmIG9ubHlfbihsLCB0ZXN0dmFsPVRydWUsIGNvZXJjZT1ib29sLCBuPTEpOgogICAgY291bnRzID0gY29sbGVjdGlvbnMuQ291bnRlcigpCiAgICBkZWYgaXRlcmF0ZV9hbmRfY291bnQoKToKICAgICAgICBmb3IgeCBpbiBpdGVydG9vbHMuaW1hcChjb2VyY2UsbCk6CiAgICAgICAgICAgIHlpZWxkIHgKICAgICAgICAgICAgaWYgeCA9PSB0ZXN0dmFsIGFuZCBjb3VudHNbdGVzdHZhbF0gPiBuOgogICAgICAgICAgICAgICBicmVhawogICAgY291bnRzLnVwZGF0ZShpdGVyYXRlX2FuZF9jb3VudCgpKQogICAgcmV0dXJuIGNvdW50c1t0ZXN0dmFsXSA9PSBuCgpkZWYgb25seV90cnV0aHkobCwgbj0xKToKICAgIGNvdW50cyA9IGNvbGxlY3Rpb25zLkNvdW50ZXIoKQogICAgZGVmIGl0ZXJhdGVfYW5kX2NvdW50KCk6CiAgICAgICAgZm9yIHggaW4gbDoKICAgICAgICAgICAgaWYgeDogCiAgICAgICAgICAgICAgICB5aWVsZCBUcnVlCiAgICAgICAgICAgICAgICBpZiBjb3VudHNbVHJ1ZV0gPiBuOiBicmVhawogICAgICAgICAgICBlbHNlOiB5aWVsZCBGYWxzZQoKICAgIGNvdW50cy51cGRhdGUoaXRlcmF0ZV9hbmRfY291bnQoKSkKICAgIHJldHVybiBjb3VudHNbVHJ1ZV0gPT0gbgoKZGVmIG9ubHlfdHJ1dGh5X2ZpeGVkKGwsIG49MSk6CiAgICB0Y291bnQgPSAwCiAgICBmb3IgeCBpbiBsOgogICAgICAgIGlmIHg6IAogICAgICAgICAgIHRjb3VudCArPSAxCiAgICAgICAgICAgaWYgdGNvdW50ID4gbjogcmV0dXJuIEZhbHNlCiAgICByZXR1cm4gdGNvdW50ID09IG4KCmRlZiBuaXNhbmgoaXRlcmFibGUsIG49MSwgbT0xKTogCiAgICBpID0gaXRlcihpdGVyYWJsZSkgCiAgICByZXR1cm4gIG0gPD0gc3VtKGFueShpKSBmb3IgeCBpbiB4cmFuZ2UobisxKSkgPD0gbgoKIiIiCmRlZiBuaXNhbmgoaXRlcmFibGUsIG49MSwgbT0xKTogCiAgICBpID0gaXRlcihpdGVyYWJsZSkgCiAgICByZXR1cm4gIGxpc3QoYW55KGkpIGZvciB4IGluIHhyYW5nZShuKzEpKQpwcmludCBuaXNhbmgoWzIsMyxOb25lXSkKcHJpbnQgbmlzYW5oKFtOb25lLDMsTm9uZV0pCgpkZWYgSm9uQ2xlbWVudHMoaXRlcmFibGUpOgogICAgaSA9IGl0ZXIoaXRlcmFibGUpCiAgICByZXR1cm4gYW55KGkpIGFuZCBub3QgYW55KGkpCiAgICAKcHJpbnQgSm9uQ2xlbWVudHMoWzIsMyxOb25lXSkKcHJpbnQgSm9uQ2xlbWVudHMoW05vbmUsMyxOb25lXSkKCm51bWJlciA9IDUwMAp0cnVlbGlzdCA9ICJsPVtUcnVlXSoxMDAwMCIKCmZhbHNlbGlzdCA9ICJsPVtGYWxzZV0qMTAwMDAiCnByaW50IHRpbWVpdC50aW1laXQoIm9ubHlfbihsKSIsIHMrdHJ1ZWxpc3QsIG51bWJlcj1udW1iZXIpCnByaW50IHRpbWVpdC50aW1laXQoIm9ubHlfbihsKSIsIHMrZmFsc2VsaXN0LCBudW1iZXI9bnVtYmVyKQoKcHJpbnQgdGltZWl0LnRpbWVpdCgib25seV90cnV0aHkobCkiLCBzK3RydWVsaXN0LCBudW1iZXI9bnVtYmVyKQpwcmludCB0aW1laXQudGltZWl0KCJvbmx5X3RydXRoeShsKSIsIHMrZmFsc2VsaXN0LCBudW1iZXI9bnVtYmVyKQoKcHJpbnQgdGltZWl0LnRpbWVpdCgib25seV90cnV0aHlfZml4ZWQobCkiLCBzK3RydWVsaXN0LCBudW1iZXI9bnVtYmVyKQpwcmludCB0aW1laXQudGltZWl0KCJvbmx5X3RydXRoeV9maXhlZChsKSIsIHMrZmFsc2VsaXN0LCBudW1iZXI9bnVtYmVyKQoKCnByaW50IHRpbWVpdC50aW1laXQoIkpvbkNsZW1lbnRzKGwpIiwgcyt0cnVlbGlzdCwgbnVtYmVyPW51bWJlcikKcHJpbnQgdGltZWl0LnRpbWVpdCgiSm9uQ2xlbWVudHMobCkiLCBzK2ZhbHNlbGlzdCwgbnVtYmVyPW51bWJlcikKCnByaW50IHRpbWVpdC50aW1laXQoIm5pc2FuaChsKSIsIHMrdHJ1ZWxpc3QsIG51bWJlcj1udW1iZXIpCnByaW50IHRpbWVpdC50aW1laXQoIm5pc2FuaChsKSIsIHMrZmFsc2VsaXN0LCBudW1iZXI9bnVtYmVyKQ==