@@ -809,15 +809,25 @@ which incur interpreter overhead.
809
809
for k in range(len(roots) + 1)
810
810
]
811
811
812
+ def iter_index(seq, value, start=0):
813
+ "Return indices where a value occurs in a sequence."
814
+ # iter_index('AABCADEAF', 'A') --> 0 1 4 7
815
+ i = start - 1
816
+ try:
817
+ while True:
818
+ yield (i := seq.index(value, i+1))
819
+ except ValueError:
820
+ pass
821
+
812
822
def sieve(n):
813
- "Primes less than n"
814
- # sieve(30) --> 2 3 5 7 11 13 17 19 23 29
815
- data = bytearray([1]) * n
816
- data[:2] = 0, 0
817
- limit = math.isqrt(n) + 1
818
- for p in compress(range(limit), data):
819
- data[p+ p : n : p] = bytearray(len(range(p+ p, n, p)))
820
- return compress(count(), data )
823
+ "Primes less than n"
824
+ # sieve(30) --> 2 3 5 7 11 13 17 19 23 29
825
+ data = bytearray([1]) * n
826
+ data[:2] = 0, 0
827
+ limit = math.isqrt(n) + 1
828
+ for p in compress(range(limit), data):
829
+ data[p* p : n : p] = bytearray(len(range(p* p, n, p)))
830
+ return iter_index(data, 1 )
821
831
822
832
def flatten(list_of_lists):
823
833
"Flatten one level of nesting"
@@ -1170,6 +1180,15 @@ which incur interpreter overhead.
1170
1180
>>> all (factored(x) == expanded(x) for x in range (- 10 , 11 ))
1171
1181
True
1172
1182
1183
+ >>> list (iter_index(' AABCADEAF' , ' A' ))
1184
+ [0, 1, 4, 7]
1185
+ >>> list (iter_index(' AABCADEAF' , ' B' ))
1186
+ [2]
1187
+ >>> list (iter_index(' AABCADEAF' , ' X' ))
1188
+ []
1189
+ >>> list (iter_index(' ' , ' X' ))
1190
+ []
1191
+
1173
1192
>>> list (sieve(30 ))
1174
1193
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
1175
1194
>>> small_primes = [2 , 3 , 5 , 7 , 11 , 13 , 17 , 19 , 23 , 29 , 31 , 37 , 41 , 43 , 47 , 53 , 59 , 61 , 67 , 71 , 73 , 79 , 83 , 89 , 97 ]
0 commit comments