如何简化Python中的列表处理?

时间:2013-05-23 19:37:14

标签: python list

这是我的第一个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

5 个答案:

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