如何在字符串中循环使用分隔符列表?
我试图参考这篇文章,但我不知道enumerate
是否是正确的方法。
my_list = range(11, 17)
# formats = ['#', '$', '%']
# How to implement formats?
my_string = '#'.join(map(str, my_list))
my_string
# have: '11#12#13#14#15#16'
# want: '11#12$13%14#15$16'
您可以将itertools.cycle
与zip
结合使用:
from itertools import cycle
my_list = range(11, 17)
formats = cycle(['#', '$', '%'])
''.join(str(a) + b for a, b in zip(my_list, formats))
产生'11#12$13%14#15$16%'
。注意后面的%
字符。你可以手动删除它,例如,通过切片到-1
:
''.join(str(a) + b for a, b in zip(my_list, formats))[:-1]
顺便说一下,如果你在代码库中经常遇到这种情况,你可以编写一个helper类,例如
from itertools import cycle
class MultiDelimiter:
def __init__(self, *delimiters):
self.delimiters = delimiters
def join(self, strings):
joined = ''.join(s + d for s, d in zip(strings, cycle(self.delimiters)))
return joined[:-1]
my_list = ['11', '12', '13', '14', '15', '16']
delim = MultiDelimiter('#', '$', '%')
delim.join(my_list) # returns: "11#12$13%14#15$16"
使用与string.join
相同的约定,有助于代码的可读性和维护。
您可以使用mod 3 (i%3)来查找需要连接的索引值。这里我使用mod 3,因为格式的长度是3。
下面是实现。
my_list = range(11, 17)
formats = ['#', '$', '%']
mystring = ''.join(str(i)+formats[(i+1)%3] for i in my_list)[:-1]
print (mystring)
因为我们使用了join,所以它也连接了最后一个范围的数字。所以我们需要排除最后一个位置。要做到这一点,我使用[:-1]
输出:
11#12$13%14#15$16
如果你想让它泛型,你可以这样做:
mystring = ''.join(str(j)+formats[i%len(formats)] for i,j in enumerate(my_list))[:-1]
下面是以下范围的结果:
formats = ['#', '$', '%']
my_list = range(11, 25)
11#12$13%14#15$16%17#18$19%20#21$22%23#24
formats = ['#', '$', '%']
my_list = range(12, 25)
12#13$14%15#16$17%18#19$20%21#22$23%24
formats = ['#', '$', '%']
my_list = range(13, 25)
13#14$15%16#17$18%19#20$21%22#23$24
formats = ['#', '$', '%']
my_list = range(14, 25)
14#15$16%17#18$19%20#21$22%23#24
formats = ['#', '$', '%']
my_list = range(15, 25)
15#16$17%18#19$20%21#22$23%24
my_list = range(11, 25)
formats = ['#', '$', '%', '&','@']
11#12$13%14&15@16#17$18%19&20@21#22$23%24
my_list = range(12, 25)
formats = ['#', '$', '%', '&']
12#13$14%15&16#17$18%19&20#21$22%23&24
如果泛型代码在任何条件下失败,请告诉我。