3

这是我的第一个 Python 程序,它是一个小实用程序,可以将文件权限的 Unix 八进制代码转换为符号形式:

s=raw_input("Octal?  ");
digits=[int(s[0]),int(s[1]),int(s[2])];
lookup=['','x','w','wx','r','rx','rw','rwx'];
uout='u='+lookup[digits[0]];
gout='g='+lookup[digits[1]];
oout='o='+lookup[digits[2]];
print(uout+','+gout+','+oout);

有没有办法利用某种“列表处理”来缩短这段代码?例如,将int函数一次全部应用于所有三个字符,s而无需进行显式索引。并索引一次lookup使用整个列表digits

4

5 回答 5

11
digits=[int(s[0]),int(s[1]),int(s[2])];

可以写成:

digits = map(int,s)

或者:

digits = [ int(x) for x in s ]  #list comprehension

看起来您可能正在使用 python3.x(或根据您的类似函数的打印使用情况计划在未来使用它),您可能希望选择列表理解,除非您想进一步挖掘并zip用作后来的答案之一证明了这一点。

于 2013-05-23T19:41:02.953 回答
5

这是您的代码的稍微优化的版本:

s = raw_input("Octal?  ")
digits = map(int, s)
lookup = ['','x','w','wx','r','rx','rw','rwx']
perms = [lookup[d] for d in digits]
rights = ['{}={}'.format(*x) for x in zip('ugo', perms)]
print ','.join(rights)
于 2013-05-23T19:41:31.453 回答
4

您也可以使用位掩码:

masks = {
    0b100: 'r',  # 4
    0b010: 'x',  # 2
    0b001: 'w'   # 1
}

octal = raw_input('Octal? ')
result = '-'

for digit in octal[1:]:
    for mask, letter in sorted(masks.items(), reverse=True):
        if int(digit, 8) & mask:
            result += letter
        else:
            result += '-'

print result
于 2013-05-23T20:00:34.800 回答
2

这是我的版本,灵感来自 Blender 的解决方案:

bits = zip([4, 2, 1], "rwx")
groups = "ugo"

s = raw_input("Octal?  ");
digits = map(int, s)

parts = []
for group, digit in zip(groups, digits):
    letters = [letter for bit, letter in bits if digit & bit]
    parts.append("{0}={1}".format(group, "".join(letters)))

print ",".join(parts)

我认为最好不要明确输入lookup列表。

于 2013-05-23T20:21:46.367 回答
1

这是我的破解(包括缺少权限的'-'):

lookup = {
    0b000 : '---',
    0b001 : '--x',
    0b010 : '-w-',
    0b011 : '-wx',
    0b100 : 'r--',
    0b101 : 'r-x',
    0b110 : 'rw-',
    0b111 : 'rwx'
}

s = raw_input('octal?: ')
print(','.join( # using ',' as the delimiter
               r + '=' + lookup[int(n, 8)] # the letter followed by the permissions
               for n, r  in zip(tuple(s), 'ugo'))) # for each number/ letter pair
于 2013-05-23T19:52:04.803 回答