我有一些代码用于为凯撒密码制作旋转字符串,只是为了好玩,我试图将它们压缩成一个。显然这是毫无意义的,因为它完全不可读,但我很好奇。不过,我还是不知道该怎么做。这是我到目前为止所尝试的内容
s = 'abcdefghijklmnopqrstuvwxyz'
rot = raw_input('Enter Rotation or Key: ')
s = s[-int(rot):] + s[:-int(rot)] if rot.isdigit() else rot.lower()+ ''.join([j for i in s for j in rot.lower() if j == i]) # This is the only line I want condensed
print s
这是实际可行的可读版本
s = 'abcdefghijklmnopqrstuvwxyz'
rot = raw_input('Enter Rotation or Key: ')
if rot.isdigit(): #I only want from here
s = s[-int(rot):] + s[:-int(rot)]
else:
for i in rot.lower():
s = s.replace(i,'')
s = rot.lower() + s #To here condensed into one line
print s
rot
是旋转字母表或凯撒密码keyed version密钥的金额。您应该能够按原样运行代码并查看确切的错误
我知道这是错误的代码,但我发现这种代码很有趣,因为该语言支持将如此多的if / else / for / lambda / whatever连接成一行。
答案 0 :(得分:1)
您可以使用reduce
(在Python 3中为functools.reduce
)重写else案例:
if rot.isdigit():
s = s[-int(rot):] + s[:-int(rot)]
else:
s = rot.lower() + reduce(lambda x, y: x.replace(y, ''), rot.lower(), s)
然后你可以将它组合成一行:
s = s[-int(rot):] + s[:-int(rot)] if rot.isdigit() else rot.lower() + reduce(lambda x, y: x.replace(y, ''), rot.lower(), s)
但你是绝对正确的:像这样写它是没有意义的。这真是难以理解。
由于您使用的是Python 2,因此您也可以在此处使用str.translate
,从rot
中移除s
中的字符。这使用该函数的deletechars
参数:
s = rot.lower() + s.translate(None, rot.lower())
你的单行表达式稍微短一些:
s = s[-int(rot):] + s[:-int(rot)] if rot.isdigit() else rot.lower() + s.translate(None, rot.lower())
答案 1 :(得分:0)
考虑到这个简单的测试用例
>>> from string import ascii_lowercase as letters
>>> s = 'this is a test with 2 numbers 55!'
>>> rot = 5
以下单行似乎可以解决问题
>>> ''.join(letters[(letters.index(i)+rot)%len(letters)] if i in letters else i for i in s)
'ymnx nx f yjxy bnym 2 szrgjwx 55!'
答案 2 :(得分:0)
这只是代码的快速打包(178字节):
rot=raw_input('Enter Rotation or Key: ').lower();s='abcdefghijklmnopqrstuvwxyz';print s[-int(rot):]+s[:-int(rot)]if rot.isdigit()else rot+reduce(lambda s,i:s.replace(i,''),rot,s)
答案 3 :(得分:0)
您可以拥有的最简单的单行:s = rotify(s, rot)
s = 'abcdefghijklmnopqrstuvwxyz'
rot = raw_input('Enter Rotation or Key: ')
s = rotify(s, rot)
print s
您需要的只是一个函数rotify()
,您已经在问题中提供了自己(我从s =
到return
进行了一些修改):
def rotify(s, rot):
if rot.isdigit():
return s[-int(rot):] + s[:-int(rot)]
else:
for i in rot.lower():
s = s.replace(i,'')
return rot.lower() + s
没有必要强迫单行。你什么也得不到,你就失去了可读性。