在join()中旋转分隔符列表



如何在字符串中循环使用分隔符列表?

我试图参考这篇文章,但我不知道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.cyclezip结合使用:

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

如果泛型代码在任何条件下失败,请告诉我。

最新更新