在列表中以固定间隔插入字符

时间:2011-12-01 18:56:09

标签: python

我正在尝试将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 个答案:

答案 0 :(得分: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'

答案 1 :(得分: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]返回长度为2的子字符串,从x

开始

range(0, len(s) - 1, 2)返回步长为2的整数列表

所以列表理解会将字符串s拆分为长度为2的子字符串,然后join会将它们重新组合在一起,但在它们之间插入“:”。

答案 2 :(得分:1)

我认为最能帮到你的是python中的一个名为slice的构造。我相信你可以在任何可迭代的对象上使用它们,包括字符串,使它们非常有用,并且知道如何使用通常是个好主意。

>>> 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'

如果您想阅读更多关于切片的内容,我们会非常好地解释in this question,以及实际python documentation.

的一部分

答案 3 :(得分:1)

>>> s='10000000C9ABCDEF'
>>> si=iter(s)
>>> ':'.join(c.lower()+next(si).lower() for c in si)
>>> '10:00:00:00:c9:ab:cd:ef'

以lambda形式:

>>> (lambda x: ':'.join(c.lower()+next(x).lower() for c in x))(iter(s))
'10:00:00:00:c9:ab:cd:ef'

答案 4 :(得分:0)

可以使用here中的grouper食谱来完成。

from itertools import izip_longest

def grouper(n, iterable, fillvalue=None):
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

使用此功能,代码如下:

def join(it):
    for el in it:
        yield ''.join(el)

':'.join(join(grouper(2, s)))

它的工作原理如下:

grouper(2,s)会返回元组'1234...' -> ('1','2'), ('3','4') ...

def join(it)执行此操作:('1','2'), ('3','4') ... -> '12', '34' ...

':'.join(...)从迭代器创建一个字符串:'12', '34' ... -> '12:34...'

此外,它可能会被重写为:

':'.join(''.join(el) for el in grouper(2, s))

答案 5 :(得分:0)

这是我简单直接的解决方案:

s = '10000000c9abcdef'

new_s = str()
for i in range(0, len(s)-1, 2):
    new_s += s[i:i+2]
    if i+2 < len(s):
        new_s += ':'

>>> new_s
'10:00:00:00:c9:ab:cd:ef'