2014-03-01 5 views
0

제목과 마찬가지로 기본적으로 목록을 사용하여 코드 생성기를 만들고 싶습니다. 제가 현재하고있는 일은 단지 한 마디로 작은 규모로 그것을하려는 것입니다.목록을 사용하여 단어를 코드로 변환하려고합니다.

letterlist = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p','q','r','s','t','u','v','w','x','y','z'] 
primes = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101] 

name = 'robert' 
ii=0 
nn = list(name) 
code=1 
while ii<=len(name)-1: 
    for nn in letterlist: 
     code *= zip(letterlist,primes)[1] 
    ii+=1 
print 'robert has a code equal to %f' %code 

그러나 나는 형식 오류를 얻을 : 나는 사전을 사용하고 그것은 작동하고 유형 '튜플'이제

대신

robert has a code equal to 409760241 

의 비 INT에 의해 순서를 곱 수 없습니다 대부분의 경우, 그러나 나는 점점 오전과

KeyError를 에러 : '%'

+0

왜 매핑의 사전을하지? –

+0

@ Edgar Aroutiounian 나는 그것을 시도했기 때문에 작동하지 않을 수 있었고 우리는 아직 사전에 대해 가르쳐주지 않았기 때문에 내가 마크를 잃을 수있는 기회가있을 것이라고 말했다. –

답변

1

당신은 DICT a를 만들 수 있습니다 차 곱셈에 대한 reduce을 사용

>>> d = dict(zip(letterlist, primes)) 
>>> d 
{'a': 2, 'c': 5, 'b': 3, 'e': 11, 'd': 7, 'g': 17, 'f': 13, 'i': 23, 'h': 19, 
'k': 31, 'j': 29, 'm': 41, 'l': 37, 'o': 47, 'n': 43, 'q': 59, 'p': 53, 's': 67, 
'r': 61, 'u': 73, 't': 71, 'w': 83, 'v': 79, 'y': 97, 'x': 89, 'z': 101} 

>>> reduce(lambda i, p: i*p, [d[c] for c in name]) 
409760241 
+0

도움을 주셔서 감사합니다. 그러나 jonrsharpe가 게시 한 내용은 무엇입니까? 나는 사전을 사용하지 않기 때문에 필요했다. –

2

귀하의 문제는 삼중입니다 :

    당신은 항상 현재의 문자에 관계없이의 zip 치우는 목록에서 1 번째 항목을 사용
  1. ;
  2. 각 항목은 두 개의 튜플 (str , int)입니다.
  3. letterlist의 모든 문자에 대해이 작업을 한 번 수행합니다 (색인 ii을 실제로 사용하지 않음).

는 대신, name에서 각 문자에 대한 다른 접근 한 목록의 인덱스를 사용

code = 1 
for c in name: 
    code *= primes[letterlist.index(c)] 
+0

응답 해 주셔서 감사합니다. 그러나 약 16,000 단어의 코드를 계산할 수있는 속도가 궁금합니다. –

+0

얼마나 빨리 처리해야합니까? 'letterlist'를 검색하는 것은'O (n)'입니다. 속도가 중요하다면, 사전 접근법은 훨씬 빠를 것이다 ('O (1)'). – jonrsharpe

+0

분 안에, 나는 5 분 동안 아무것도 남기지 않았다. –

관련 문제