2017-11-12 25 views

Odpowiedz

7

Oto uproszczone podejście:

string = 'A3G3A' 

expanded = '' 

for character in string: 
    if character.isdigit(): 
     expanded += expanded[-1] * (int(character) - 1) 
    else: 
     expanded += character 

print(expanded) 

WYJŚCIE: AAAGGGA

Zakłada on ważny wkład. Jego ograniczeniem jest to, że współczynnik powtórzeń musi być jednocyfrowy, np. 2 - 9. Jeśli chcemy czynniki powtarzania powyżej 9, musimy zrobić nieco więcej parsowanie napisu:

from itertools import groupby 

groups = groupby('DA10G3ABC', str.isdigit) 

expanded = [] 

for is_numeric, characters in groups: 

    if is_numeric: 
     expanded.append(expanded[-1] * (int(''.join(characters)) - 1)) 
    else: 
     expanded.extend(characters) 

print(''.join(expanded)) 

WYJŚCIE: DAAAAAAAAAAGGGABC

+0

[itertools.groupby] (https://docs.python.org/3/library/itertools .html # itertools.groupby) - wygeneruje iteratory zawierające {A, 10, G, 3, ABC}? w oparciu o true/false flip isdigit? –

+1

@PatrickArtner, tak, ale będzie to również wynik 'isdigit()' wraz z iteratorami, więc wiesz również, na co patrzysz! Koncepcyjnie, coś w stylu: [[Fałsz, ['A']), (Prawda, ['1', '0']), (Fałsz, ['G']), (Prawda, ['3']) , (Fałsz, ['A', 'B', 'C'])] ' – cdlane

+0

czysty, thx dla wyjaśnienia –

2

Zakładając, że format jest zawsze litera a następnie przez liczbę całkowitą z ostatniego całkowitą ewentualnie brakuje:

>>> from itertools import izip_longest 
>>> s = 'A3G3A' 
>>> ''.join(c*int(i) for c, i in izip_longest(*[iter(s)]*2, fillvalue=1)) 
'AAAGGGA' 

Zakładając, że format może być dowolny podciąg następnie przez liczbę całkowitą, z liczbą całkowitą ewentualnie dłużej niż jedną cyfrę i ostatniej liczby całkowitej ewentualnie brakujące:

>>> from itertools import izip_longest 
>>> import re 
>>> s = 'AB10GY3ABC' 
>>> sp = re.split('(\d+)', s) 
>>> ''.join(c*int(i) for c, i in izip_longest(*[iter(sp)]*2, fillvalue=1)) 
'ABABABABABABABABABABGYGYGYABC' 
0

Innym rozwiązaniem mogłoby być -

import re 
input_string = 'A3G3A' 
alphabets = re.findall('[A-Z]', input_string) # List of all alphabets - ['A', 'G', 'A'] 
digits = re.findall('[0-9]+', input_string) # List of all numbers - ['3', '3'] 
final_output = "".join([alphabets[i]*int(digits[i]) for i in range(0, len(alphabets)-1)]) + alphabets[-1] 
# This expression repeats each letter by the number next to it (Except for the last letter), joins the list of strings into a single string, and appends the last character 
# final_output - 'AAAGGGA' 

Objaśnienie -

In [31]: alphabets # List of alphabets in the string 
Out[31]: ['A', 'G', 'A'] 

In [32]: digits # List of numbers in the string (Including numbers more than one digit) 
Out[32]: ['3', '3'] 

In [33]: list_of_strings = [alphabets[i]*int(digits[i]) for i in range(0, len(alphabets)-1)] # List of strings after repetition 

In [34]: list_of_strings 
Out[34]: ['AAA', 'GGG'] 

In [35]: joined_string = "".join(list_of_strings) # Joined list of strings 

In [36]: joined_string 
Out[36]: 'AAAGGG' 

In [38]: final_output = joined_string + input_string[-1] # Append last character of the string 

In [39]: final_output 
Out[39]: 'AAAGGGA' 
1

Minimalny czystego kodu Pythona które zarządzają wszystkie przypadki.

output = '' 
n = '' 
c = '' 
for x in input + 'a': 
    if x.isdigit(): 
     n += x 
    else: 
     if n == '': 
      n = '1' 
     output = output + c*int(n) 
     n = '' 
     c = x 

z input="WA5OUH2!10", output jest WAAAAAOUHH!!!!!!!!!!. +'a' to wymuszenie dobrego zachowania na końcu, ponieważ wyjście jest opóźnione.

+0

Niezły, ale użyłbym również listy [] dla wyjścia, dołączenia i sklejenia z łączeniem. I deklarowanie zmiennych w tym samym wierszu i nie używanie łamania wierszy dla instrukcji if tworzy mniejszą czytelność w mojej opinii.Wejście –

+0

jest wbudowaną funkcją, powinieneś unikać używania jej jako nazwy zmiennej –

0

pomocą * powtarzać znaków:

założenie zakres peryferyjnym pomiędzy [1,9]
q = 'A3G3A' 
try: 
    int(q[-1]) # check if it ends with digit 
except: 
    q = q+'1' # repeat only once 
"".join([list(q)[i]*int(list(q)[i+1]) for i in range(0,len(q),2)]) 
Powiązane problemy