最小化代码行

时间:2015-08-13 14:26:58

标签: python python-2.7 minimize

我有一些代码用于为凯撒密码制作旋转字符串,只是为了好玩,我试图将它们压缩成一个。显然这是毫无意义的,因为它完全不可读,但我很好奇。不过,我还是不知道该怎么做。这是我到目前为止所尝试的内容

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连接成一行。

4 个答案:

答案 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

没有必要强迫单行。你什么也得不到,你就失去了可读性。