这是我的第一个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
?
答案 0 :(得分: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
,如后面的一个答案所示。
答案 1 :(得分: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)
答案 2 :(得分: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
答案 3 :(得分: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
列表。
答案 4 :(得分: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