2014-07-16 4 views
1

숫자의 배수 인수를 나타내는 접두사 문자가있는 문자열 목록이 있습니다. 내가 좋아하는 데이터가 그래서 경우 :문자열의 문자를 Python을 사용하여 여러 문자로 변환

data = ['101n', '100m', '100.100f'] 

을 나는 해당 문자열을 삽입하려면 사전

prefix_dict = {'y': 'e-24', 'z': 'e-21', 'a': 'e-18', 'f': 'e-15', 'p': 'e-12', 
       'n': 'e-9', 'u': 'e-6', 'm': 'e-3', 'c': 'e-2', 'd': 'e-1', 
       'da': 'e1', 'h': 'e2', 'k': 'e3', 'M': 'e6', 'G': 'e9', 
       'T': 'e12', 'P': 'e15', 'E': 'e18', 'Z': 'e21', 'Y': 'e24'} 

를 사용하고 싶습니다. 내 비슷한 질문을 할 때 한 글자가 다른 글자로 번역됩니다. 번역 기능을 사용하여 한 문자를 여러 문자로 변환하는 방법이 있습니까? 아니면 다르게 접근해야합니까?

+0

당신이 죄송 –

+0

을 기대하는 출력의 예를 제공을 , 내가 기대하는 출력은 [= 101e-9, 100e-3, 100e00e-15] – mataleo99

답변

5

이뿐만 아니라 'da' 작동 :

>>> data = ['101n', '100m', '100.100f', '1d', '1da'] 
>>> import re 
>>> r = re.compile(r'([a-zA-Z]+)$') 
>>> for d in data: 
    print r.sub(lambda m: prefix_dict.get(m.group(1), m.group(1)), d) 
...  
101e-9 
100e-3 
100.100e-15 
1e-1 
1e1 

그리고 비 정규식 버전 itertools.takewhile을 사용 :

>>> from itertools import takewhile 
>>> def find_suffix(s): 
    return ''.join(takewhile(str.isalpha, s[::-1]))[::-1] 
... 
>>> for d in data: 
    sfx = find_suffix(d) 
    print (d.replace(sfx, prefix_dict.get(sfx, sfx))) 
...  
101e-9 
100e-3 
100.100e-15 
1e-1 
1e1 
0
import re 

data = ['101da', '100m', '100.100f'] 

prefix_dict = {'y': 'e-24', 'z': 'e-21', 'a': 'e-18', 'f': 'e-15', 'p': 'e-12', 
       'n': 'e-9', 'u': 'e-6', 'm': 'e-3', 'c': 'e-2', 'd': 'e-1', 
       'da': 'e1', 'h': 'e2', 'k': 'e3', 'M': 'e6', 'G': 'e9', 
       'T': 'e12', 'P': 'e15', 'E': 'e18', 'Z': 'e21', 'Y': 'e24'} 
comp = re.compile(r"[^\[A-Za-z]") 
for ind,d in enumerate(data): 
    pre = re.sub(comp,"",d) 
    data[ind] = d.replace(pre,prefix_dict.get(pre)) 
print data 
['101e1', '100e-3', '100.100e-15'] 

대신

+0

입니다.이 문자는 단 하나의 문자가 아닌 키에서도 작동합니까? – Serbitar

+0

그래서 두 개 이상의 문자가있는 키가 있습니까? –

+0

위의 사전에서 보면 'da'가 표시됩니다. – Serbitar

1

시도하여 다시 사용하는 pre = [x for x in d if x.isalpha()][0]을 사용할 수 있습니다 :이 사전 데이터의 임의의 조합 일

for i, entry in enumerate(data): 
    for key, value in sorted(prefix_dict.items(), 
          key = lambda x: len(x[0]), reverse=True):  
# need to sort the dictionary so that 'da' always comes before 'a' 
     if key in entry: 
      data[i] = entry.replace(key, value) 
print(data) 

합니다. 사전 키가 항상 1 문자열 만 길면 여기에 다른 솔루션이 많이 있습니다. 당신은 이것에 대한 정규식을 사용할 수 있습니다

+0

목록의 값이 변경되지 않습니다. –

+0

당신이 맞고 고정되어 있습니다. – Serbitar

관련 문제