2014-12-04 82 views
-1

我需要源字符串轉換爲擴展字符串,e.g: A1f4h3L2 => AffffhhhLL的Python 3.X:轉換字符串

我的代碼:

source = [] 
answer = '' 
s1 = 'S15Y16r13g11b8X8J15Q9V2i18p5e10' 
source += s1 
i = 0 
while i <= (len(source)-1): 
    if source[i].isalpha: 
     if source[i+1].isdigit: 
      if source[i+2].isdigit: 
       answer += (str(source[i]) * int(source[i+1] + source[i+2])) 
       i += 2 
      else: 
       answer += (str(source[i]) * int(source[i+1])) 
       i += 1 
      i+=1 

它的工作,直到 「8X」。與異常:ValueError異常:無效的字面INT()基數爲10: '8X'

Link to pytontutor.com visualisation

我不明白爲什麼代碼工作,直到我== 12

+0

你是不是調用str.is *方法;添加括號。另外,你假設最後一個字母后面跟着兩位數字。 – 2014-12-04 12:31:08

回答

2

可以這樣做在Python的方式:

>>> a="A1f4h3L2" 
>>> "".join(map(lambda x,y:x*int(y),a[::2],a[1::2])) 
'AffffhhhLL' 

它是如何工作的:

>>> a[::2]   # give me all alpahbhet 
'AfhL' 
>>> a[1::2]   # gives me all integer 
'1432' 

您可以使用壓縮也:以上

>>> "".join(x*int(y) for x,y in zip(a[::2],a[1::2])) 
'AffffhhhLL' 

適用於數字不到10

如果數字大於10:

:使用Lambda和地圖

>>> import re 
>>> s1 = 'S15Y16r13g11b8X8J15Q9V2i18p5e10' 
>>> "".join(x*int(y) for x,y in zip(re.findall('[a-zA-Z]',s1),re.findall('\d+',s1)))  
'SSSSSSSSSSSSSSSYYYYYYYYYYYYYYYYrrrrrrrrrrrrrgggggggggggbbbbbbbbXXXXXXXXJJJJJJJJJJJJJJJQQQQQQQQQVViiiiiiiiiiiiiiiiiipppppeeeeeeeeee' 

>>> "".join(map(lambda x,y:x*int(y),re.findall('[a-zA-Z]',s1),re.findall('\d+',s1)))  
'SSSSSSSSSSSSSSSYYYYYYYYYYYYYYYYrrrrrrrrrrrrrgggggggggggbbbbbbbbXXXXXXXXJJJJJJJJJJJJJJJQQQQQQQQQVViiiiiiiiiiiiiiiiiipppppeeeeeeeeee' 

檢查這個,如果你不想使用重:

>>> s1 = 'S15Y16r13g11b8X8J15Q9V2i18p5e10' 
>>> my_list =[] 
>>> my_digit ='' 
>>> for x in s1: 
...  if x.isalpha(): 
...   if my_digit != '': 
...    my_list.append(my_digit) 
...    my_digit='' 
...   my_list.append(x) 
...  else: 
...   my_digit += x 
... 
>>> my_list 
['S', '15', 'Y', '16', 'r', '13', 'g', '11', 'b', '8', 'X', '8', 'J', '15', 'Q', '9', 'V', '2', 'i', '18', 'p', '5', 'e'] 

現在你可以從上面施加任何方法是這樣的:

>>> "".join(x*int(y) for x,y in zip(my_list[::2],my_list[1::2])) 
+0

該整數可能超過1位數 – fredtantini 2014-12-04 10:34:57

+0

@Hackaholic該解決方案將使用數字大於9的數字嗎?例如。 A15b22? – Ivsh 2014-12-04 10:35:03

+0

是的,那麼也有辦法只是一分鐘 – Hackaholic 2014-12-04 10:35:55

1

我會先轉換成字符串:

A = 'S15Y16r13g11b8X8J15Q9V2i18p5e10' 

對此列表:

B = ['S', '15', 'Y', '16', 'r', '13', 'g', '11', 'b', '8', 'X', '8', 'J', '15', 'Q', '9', 'V', '2', 'i', '18', 'p', '5', 'e', '10'] 

轉換

A = 'S15Y16r13g11b8X8J15Q9V2i18p5e10' 
B = [] 
start = 0 
while start < len(A): 
    i = start 
    while A[i].isalpha(): 
    i = i + 1 
    k = i 
    while k < len(A) and A[k].isdigit(): 
    k = k + 1 
    B.append(A[start:i]) 
    B.append(A[i:k]) 
    start = k 

現在是比較容易的方式來產生所需的字符串:從A二廳到B可通過切割件串完成

>>> ''.join([(B[i] * int(B[i+1])) for i in range(0, len(B), 2)]) 
'SSSSSSSSSSSSSSSYYYYYYYYYYYYYYYYrrrrrrrrrrrrrgggggggggggbbbbbbbbXXXXXXXXJJJJJJJJJJJJJJJQQQQQQQQQVViiiiiiiiiiiiiiiiiipppppeeeeeeeeee' 
+0

你如何將他們轉換爲列表??? – Hackaholic 2014-12-04 11:07:59

+0

@Hackaholic編輯答案。 – vz0 2014-12-04 11:22:51

+0

努力+1 – Hackaholic 2014-12-04 11:30:09

0

你的規格是不是過於詳細,但你可以很容易地更改正則表達式來匹配您的具體要求

>>> def expand(s): 
...  from re import findall 
...  return "".join([c*int(n) for c, n in zip(findall(r'[A-Za-z]+',s), 
...            findall(r'[0-9]+', s))]) 
... 
>>> print(expand(('S15Y16r13g11b8X8J15Q9V2i18p5e10')) 
SSSSSSSSSSSSSSSYYYYYYYYYYYYYYYYrrrrrrrrrrrrrgggggggggggbbbbbbbbXXXXXXXXJJJJJJJJJJJJJJJQQQQQQQQQVViiiiiiiiiiiiiiiiiipppppeeeeeeeeee 
>>> 
0

沒有re

def expand(s): 

    non_d = [] ; d = [] ; current_digit = "" 
    for c in s: 
     if c.isdigit(): current_digit = current_digit+c 
     else: 
      non_d.append(c) 
      if current_digit: d.append(current_digit) 
      current_digit = "" 
    d.append(current_digit) 
    return("".join(c*int(n) for c,n in zip(non_d, d))) 

s = 'S15Y16r13g11b8X8J15Q9V2i18p5e10' 
print expand(s) 

輸出

SSSSSSSSSSSSSSSYYYYYYYYYYYYYYYYrrrrrrrrrrrrrgggggggggggbbbbbbbbXXXXXXXXJJJJJJJJJJJJJJJQQQQQQQQQVViiiiiiiiiiiiiiiiiipppppeeeeeeeeee