在列表中按规律插入字符

10 投票
6 回答
2764 浏览
提问于 2025-04-17 07:30

我想把 10000000C9ABCDEF 转换成 10:00:00:00:c9:ab:cd:ef 这种格式。

这样做的原因是,当我登录到我的存储设备时,看到的格式是 10000000C9ABCDEF,这是主机总线适配器(HBA)的显示方式。但SAN交换机却是用 10:00:00:00:c9:ab:cd:ef 这种格式来理解的。

到目前为止,我只能做到以下这些:

#script to convert WWNs to lowercase and add the :.
def wwn_convert():
    while True:
        wwn = (input('Enter the WWN or q to quit- '))
        list_wwn = list(wwn)
        list_wwn = [x.lower() for x in list_wwn]
        lower_wwn = ''.join(list_wwn)
        print(lower_wwn)
    if wwn == 'q':
        break

wwn_convert()

我尝试过用 ':'.join,但这样会在每个字符后面都加上 :,结果变成了 1:0:0:0:0:0:0:0:c:9:a:b:c:d:e:f

我想让 .join 通过一个循环来处理,比如我可以写 for i in range (0, 15, 2),这样就能在每两个字符后面插入一个 :,但我不太确定该怎么做。(好在Python允许我以2或其他任何我想要的数字来循环。)

另外,如果有人能给我一些建议,让我能更好地写这个脚本,我会非常感激...

请帮帮我。

我在Windows 7(64位)上使用的是Python 3.2.2版本。

6 个回答

1

我觉得对你最有帮助的是Python中的一个叫做“切片”的概念。你可以在任何可迭代的对象上使用切片,包括字符串,这让它们非常实用,学会使用切片通常是个很不错的主意。

>>> s = '10000000C9ABCDEF'
>>> [s.lower()[i:i+2] for i in range(0, len(s)-1, 2)]
['10', '00', '00', '00', 'c9', 'ab', 'cd', 'ef']
>>> ':'.join([s.lower()[i:i+2] for i in range(0, len(s)-1, 2)])
'10:00:00:00:c9:ab:cd:ef'

如果你想了解更多关于切片的内容,可以在这个问题中找到很好的解释,还有Python文档中的相关部分。

2
>>> s = '10000000C9ABCDEF'
>>> ':'.join([s[x:x+2] for x in range(0, len(s)-1, 2)])
'10:00:00:00:C9:AB:CD:EF'

解释:

':'.join(...) 这个方法会把你给的每一部分用 ':' 连接起来,形成一个新的字符串。

s[x:x+2] 这个方法会从字符串 s 中提取出从位置 x 开始的长度为 2 的子字符串。

range(0, len(s) - 1, 2) 这个方法会生成一个从 0 开始到字符串 s 的长度减 1 的整数列表,步长为 2。

所以,列表推导式会把字符串 s 分割成长度为 2 的小部分,然后 join 方法会把这些小部分重新连接起来,中间用 ':' 分隔。

6

这里还有一个选择:

>>> s = '10000000c9abcdef'
>>> ':'.join(a + b for a, b in zip(*[iter(s)]*2))
'10:00:00:00:c9:ab:cd:ef'

或者可以更简洁一些:

>>> import re
>>> ':'.join(re.findall('..', s))
'10:00:00:00:c9:ab:cd:ef'

撰写回答