2017-11-12 17 views

Trả lời

7

Dưới đây là một cách tiếp cận đơn giản:

string = 'A3G3A' 

expanded = '' 

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

print(expanded) 

OUTPUT: AAAGGGA

Nó giả định đầu vào hợp lệ. Giới hạn của nó là yếu tố lặp lại phải là một chữ số duy nhất, ví dụ: 2 - 9. Nếu chúng ta muốn các yếu tố lặp lại lớn hơn 9, chúng ta phải làm phân tích nhẹ hơn của chuỗi:

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)) 

OUTPUT: DAAAAAAAAAAGGGABC

+0

[itertools.groupby] (https://docs.python.org/3/library/itertools .html # itertools.groupby) - nó sẽ tạo ra các trình lặp có chứa {A, 10, G, 3, ABC}? dựa trên lật đúng/sai của isdigit? –

+1

@PatrickArtner, có nhưng nó cũng sẽ bao gồm kết quả của 'isdigit()' cùng với các trình vòng lặp để bạn cũng biết những gì bạn đang xem! Về mặt khái niệm, một cái gì đó như: '[(Sai, ['A']), (Đúng, ['1', '0']), (Sai, ['G']), (Đúng, ['3']) , (False, ['A', 'B', 'C'])] ' – cdlane

+0

gọn gàng, thx để giải thích –

2

Giả sử rằng các định dạng luôn là một bức thư tiếp theo là một số nguyên , với số nguyên cuối cùng có thể là mất tích:

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

Giả sử rằng các định dạng có thể được bất kỳ chuỗi tiếp theo là một số nguyên, với các số nguyên có thể dài hơn một chữ số và số nguyên cuối cùng có thể là mất tích:

>>> 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

cách tiếp cận khác có thể là -

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' 

Giải thích -

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

Một tối thiểu tinh khiết mã python mà quản lý tất cả các trường hợp.

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 

với input="WA5OUH2!10", outputWAAAAAOUHH!!!!!!!!!!. +'a' là thực thi hành vi tốt ở cuối, vì đầu ra bị trễ.

+0

Đẹp nhất, nhưng tôi cũng sẽ sử dụng danh sách [] cho đầu ra, nối và dán với tham gia. Và khai báo các biến trên cùng một hàng và không sử dụng ngắt hàng cho các câu lệnh nếu tạo ra khả năng đọc thấp hơn theo ý kiến ​​của tôi. –

+0

đầu vào là một hàm dựng sẵn, bạn nên tránh sử dụng nó như một tên biến –

0

sử dụng * để lặp lại các nhân vật:

giả định phạm vi lặp lại giữa [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)]) 
Các vấn đề liên quan