2013-04-14 39 views
-2

我正试图编写一个程序,以随机顺序从1到26的数字生成一个列表,然后使用该列表'加密'给定的单词,以便字母的第n个字母是映射到随机列表中的第n个数字。例如:与加密混淆

随机列表是:

[8,2,25,17,6,9,12,19,21,20,18,3,15,1,11,0,23,14,4,7,24,5,10,13,16,22] 

这意味着字act变得[8,25,7]和字xyzzy变得[13,16,22,22,16]

我有下面的代码,但我不知道如何着手:

#8a 
def randomalpha(): 
    a=[0]*26 
    count = 0 
    while count < 25: 
     r = randrange(0,26) 
     if r not in a: 
      a[count] = r 
      count += 1 
    return(a) 
print(f()) 
#8b 
ls=['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'] 
def encrypt(alphabet): 
    a=randomalpha() 
    count=0 
    b=input('enter a word') 
    for i in b:    #not sure if i am ok up to here but this is when i got really confused 


print(encrypt(ls)) 
+0

所以后来我在输入LS接下来的代码是一个字母表,所以说第一个随机列表开始[3,8,10 ... 3 = a 8 = b 10 = c所以如果我然后把我的输入放入第二个代码'abc'它会返回[ 3,8,10] –

+1

如果'encrypt()'遇到非小写和/或非alpha字符会发生什么?你使用的是什么版本的Python? – martineau

+0

你的问题似乎不完整和/或真的很模糊。请以某种方式重写您的问题,以便每个人都能理解您正在努力实现的目标以及问题所在。 – KennyV

回答

0
import random 
import string 

def randomalpha(): 
    nums, result = range(26), [] # [0, 1, 2, 3, ... --> 25] 
    random.shuffle(nums) 
    for i in range(26): 
     result.append(nums.pop()) 
    return result 

def encrypt(s): 
    alphabet = list(string.lowercase) # ['a', 'b', 'c', ... --> 'z'] 
    key = dict(zip(alphabet, randomalpha())) 
    return ''.join([str(key[ltr]) for ltr in s]) 

参考文献:

+1

您的'randomalpha'函数很可能会产生重复值 –

+0

@JonClements啊,谢谢你指出! –

+0

@ F3AR3DLEGEND你不能得到这个工作,我得到这个回溯(最近一次通话最后): 文件“C:\ Users \ Ian \ Downloads \ lab8-1.py”,行146,在 print(encrypt )) 文件“C:\ Users \ Ian \ Downloads \ lab8-1.py”,行143,加密 alphabet = list(string.lowercase) NameError:未定义全局名称'string' –

2

我对此采取:

from string import ascii_lowercase 
from random import shuffle 

def char2num(chars): 
    r = range(len(chars)) 
    shuffle(r) 
    return dict(zip(chars, r)) 

def encrypt(s, lookup): 
    return ' '.join(str(lookup[ch]) for ch in s) 

print encrypt('cat', char2num(ascii_lowercase)) 
从我有工作,并返回随机非重复整数列表...第一个代码
+0

@ F3AR3DLEGEND不完全(我发布了错误的版本) - 它更通用 - 不会用'.pop'做一些奇怪的事情,并不一定将'alphabet'转换为列表,并使用生成器代替'.join'中的list-comp –