2012-11-21 128 views
2

字母與數字我有什麼:翻譯使用python

s='areyo uanap ppple' 

我想要什麼:

s='12345 12324 11123' 

我應該使用字典和翻譯在s.split(' ')每個i?還是有更簡單的方法?

+1

,我沒有看到這種映射。你首先將'a'翻譯成'1'(在第一個單詞中),然後再把'a'翻譯成'2'(第二個單詞)... – mgilson

+0

我認爲OP對每個單詞都重新開始。 –

+0

請將字母定義爲數字映射。 – martineau

回答

1

如果我理解正確的OP,這可能是一個解決辦法:

s='areyo uanap ppple' 
def trans(word): 
    d = {} 
    for char in word: 
     if char not in d.keys(): 
      d[char] = len(d.keys()) + 1 
     yield str(d[char]) 
o = ' '.join([ ''.join(trans(word)) for word in s.split(' ')]) 
print repr(o) 

導致:

'12345 12324 11123' 

建設上unutbu答案的unique,這也將是可能的:

' '.join([''.join([ { a:str(i+1) for i,a in enumerate(unique(word)) }[char] for char in word]) for word in s.split(' ') ]) 

這裏是另一個,我想我有點被帶走:)

' '.join([ w.translate(maketrans(*[ ''.join(x) for x in zip(*[ (a,str(i+1)) for i,a in enumerate(unique(w)) ]) ])) for w in s.split(' ') ]) 
1

你可以使用unicode.translate

import string 

def unique(seq): 
    # http://www.peterbe.com/plog/uniqifiers-benchmark (Dave Kirby) 
    # Order preserving 
    seen = set() 
    return [x for x in seq if x not in seen and not seen.add(x)] 

def word2num(word): 
    uniqs = unique(word) 
    assert len(uniqs) < 10 
    d = dict(zip(map(ord,uniqs), 
       map(unicode,string.digits[1:]))) 
    return word.translate(d) 

s = u'areyo uanap ppple' 
for word in s.split(): 
    print(word2num(word)) 

產生

12345 
12324 
11123 

需要注意的是,目前還不清楚,你想,如果有一個字超過9個唯一字母發生什麼。如果word2num通過這樣的話,我已經使用assert來投訴。

+0

單詞中不會有超過5個唯一字母,因爲每個5個字母都是獨立考慮的。字符串如'abcde fghij ffabc'將被翻譯爲'12345 12345 11234' – calvin

1

使用unique_everseen()itertools recipes

In [5]: def func(s): 
    for x in s.split(): 
      dic={} 
      for i,y in enumerate(unique_everseen(x)): 
        dic[y]=dic.get(y,i+1) 
      yield "".join(str(dic[k]) for k in x)  
      dic={} 
    ...:    

In [6]: " ".join(x for x in func('areyo uanap ppple')) 
Out[6]: '12345 12324 11123' 

In [7]: " ".join(x for x in func('abcde fghij ffabc')) 
Out[7]: '12345 12345 11234' 
2
s='areyo uanap ppple' 
incr=1 
out='' 
dict={} 
for x in s: 
    if ' ' in x: 
     incr=1 
     dict={} 
     out+=' ' 
     continue; 
    if x in dict.keys(): 
     out+=str(dict[x]) 
     continue; 

    out+=str(incr) 
    dict[x]=incr 
    incr=incr+1 

print out //12345 12324 11123