首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将八进制转换为字符串的Python脚本,例如八进制(755)到(rwxr-xr-x)。坚持增加破折号分离器

将八进制转换为字符串的Python脚本,例如八进制(755)到(rwxr-xr-x)。坚持增加破折号分离器
EN

Stack Overflow用户
提问于 2020-02-25 12:02:14
回答 3查看 6.7K关注 0票数 5

下面是打印转换成字符串的八进制的脚本。对于如何在每个权限(r/w/x)的字符串中添加分隔符的建议,我将不胜感激。

代码语言:javascript
复制
def octal_to_string(octal):
    result = ""
    value_letters = [(4,"r"),(2,"w"),(1,"x")]
    #Iterating over each digit in octal
    for digit in [int(n) for n in str(octal)]:

        #Checking for each of permission values
        for value, letter in value_letters:
            if digit >= value:
                result += letter
                digit -= value
            else:
                pass
    return result

我现在得到:

代码语言:javascript
复制
In [7]: octal_to_string(755)
Out[7]: 'rwxrxrx'

In [8]: octal_to_string(644)
Out[8]: 'rwrr'
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-02-25 12:15:23

要快速修复,只需将pass替换为result += '-';对于每个为假的权限测试,您只需插入一个破折号:

代码语言:javascript
复制
for value, letter in value_letters:
    if digit >= value:
        result += letter
        digit -= value
    else:
        result += '-'

不过,我只会使用,与& bitwise and operator一起使用

代码语言:javascript
复制
for value, letter in value_letters:
    result += letter if digit & value else '-'

这是因为421是数字的十进制(和八进制)值,3位中的每一位都设置为1,其他位设置为0。digit & 4只会产生40,这取决于在digit中设置的右位的第3位的值。由于0 is false, and 4 is a true value,这允许您测试是否设置了正确的位,因此可以在权限字母和-之间做出决定。我使用一个在一行中返回。

接下来,我不会使用列表理解将输入值转换为八进制数字;只需在这里使用map()懒散地进行转换,而不创建额外的list对象:

代码语言:javascript
复制
for digit in map(int, str(octal)):

接下来,尽量避免在循环中使用字符串连接;尽管Python已经进行了一些优化,以避免在简单情况下的最坏情况下的性能,但您很容易忽略这种优化。最好将字符附加到列表中,然后使用str.join()一步创建最终字符串。

组合成一个完整的功能:

代码语言:javascript
复制
def octal_to_string(octal):
    result = []
    for digit in map(int, str(octal)):
        for value, letter in ((4, "r"), (2, "w"), (1, "x")):
            result.append(letter if digit & value else "-")
    return "".join(result)

演示:

代码语言:javascript
复制
>>> octal_to_string(755)
'rwxr-xr-x'
>>> octal_to_string(644)
'rw-r--r--'

现在,函数接受的是十进制数,而不是八进制数。从API设计中,您确实希望只接受字符串(包含表示八进制值的数字),或者如果接受整数,则应该将该值视为十进制,并使用0o八进制表示法:

代码语言:javascript
复制
>>> 0o755  # actual octal number
493
>>> format(0o755, "o")  # string representing value in octal notation
'755'

如果这样做,只需将str(octal)转换为format(octal, 'o')以获得八进制数字:

代码语言:javascript
复制
>>> octal = 0o755
>>> for digit in map(int, format(octal, "o")):
...     print(digit)
...
...
7
5
5
票数 2
EN

Stack Overflow用户

发布于 2020-02-25 12:15:44

pass更改为result += "-"

代码语言:javascript
复制
def octal_to_string(octal): 
    result = "" 
    value_letters = [(4,"r"),(2,"w"),(1,"x")] 
    #Iterating over each digit in octal 
    for digit in [int(n) for n in str(octal)]: 

        #Checking for each of permission values 
        for value, letter in value_letters: 
            if digit >= value: 
                result += letter 
                digit -= value 
            else: 
                result += "-" 
    return result 

print(octal_to_string(755))

输出:

代码语言:javascript
复制
rwxr-xr-x
票数 3
EN

Stack Overflow用户

发布于 2022-08-20 08:18:41

代码语言:javascript
复制
def octal_to_string(octal):
    result = ""
    value_letters = [(4,"r"),(2,"w"),(1,"x")]
    # Iterate over each of the digits in octal
    for digits in [int(n) for n in str(octal)]:
        # Check for each of the permissions values
        for value, letter in value_letters:
            if digits >= value:
                result += letter
                digits -= value
            else:
                result += "-"
    return result
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60394192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档