2

私が持っているもの:

s='areyo uanap ppple'

私が欲しいもの:

s='12345 12324 11123'

辞書を使用して、それぞれを翻訳する必要がありiますs.split(' ')か? またはより簡単な方法はありますか?

4

4 に答える 4

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
于 2012-11-21T18:44:41.507 に答える
1

itertools レシピunique_everseen()からの使用:

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'
于 2012-11-21T17:50:22.300 に答える
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(' ') ])
于 2012-11-21T17:44:27.597 に答える
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 個を超える一意の文字がある場合、何をしたいのか不明であることに注意してください。そのような言葉が渡された場合、私はassert不平を言うために使用しました。word2num

于 2012-11-21T17:48:30.230 に答える