Diciamo che ho un numero con uno schema ricorrente, cioè esiste una stringa di cifre che si ripetono per rendere il numero in questione. Ad esempio, tale numero potrebbe essere 1234123412341234
, creato ripetendo le cifre 1234
.
Quello che mi piacerebbe fare, è trovare il modello che si ripete per creare il numero. Pertanto, data 1234123412341234
, vorrei calcolare 1234
(e forse 4
, per indicare che 1234
si ripete 4 volte per creare 1234123412341234
)Trovare il modello ricorrente
So che avrei potuto fare questo:
def findPattern(num):
num = str(num)
for i in range(len(num)):
patt = num[:i]
if (len(num)/len(patt))%1:
continue
if pat*(len(num)//len(patt)):
return patt, len(num)//len(patt)
Tuttavia, questo sembra un po 'troppo hacky. Ho pensato che avrei potuto usare itertools.cycle
per confrontare due cicli per l'uguaglianza, che in realtà non pan fuori:
In [25]: c1 = itertools.cycle(list(range(4)))
In [26]: c2 = itertools.cycle(list(range(4)))
In [27]: c1==c2
Out[27]: False
C'è un modo migliore per calcolare questo? (Mi piacerebbe essere aperto a una regex, ma non ho idea di come applicarlo lì, che è il motivo per cui non ho incluso nel mio tentativi)
EDIT:
- I don è necessario sapere che il numero ha uno schema ripetitivo, quindi devo restituire
None
se non ce n'è uno. - Al momento, mi preoccupo solo di rilevare numeri/stringhe composte interamente da un motivo ripetuto. Tuttavia, in seguito, io probabilmente anche essere interessati a trovare i modelli che iniziano dopo pochi caratteri:
magic_function (78961234123412341234)
sarebbero ritornati 1234
come il modello, come il 4
numero di volte che viene ripetuto, e 4
come il primo indice nell'input dove il modello si presenta prima
E qualcosa come "771177117711"? È molto difficile. –
@AlexThornton: Questo è uno schema di '7711', 3 volte, o un pattern di' 1177', due volte (con il rumore iniziale e finale) – inspectorG4dget
L'espressione regolare fallisce per questo, fastidiosamente. Vedrò se riesco a pensare a qualcosa. –