我正在尝试创建一个函数,该函数可以接受任意长度的字符串,然后接受具有第一个字母的字符串,然后接受第一个字母的字母一个索引,然后接受第二个字母的字母2索引,依此类推。假设我有一个字符串:
my_string = "0123456789"
预期输出:
'0136'
或另一个示例
my_string = "0123456789ABCDEFG"
预期输出:
'0136AF'
我尝试过的事情:
#Try 1
new_string = ""
for i in range(len(string)):
new_string += string[:i+i]
print(new_string)
#Try 2
new_string = ""
for i in range(len(string)):
new_string += string[:(i*(i+1))/2]
print(new_string)
答案 0 :(得分:1)
您可以使用以下简单的while循环来完成此操作,并保持索引和增量:
string = "0123456789ABCDEFG"
new_string, ind, inc = "", 0, 0
while ind < len(string):
new_string += string[ind]
inc += 1
ind += inc
new_string
# '0136AF'
或使用奇妙的itertools
:
from itertools import accumulate, count, takewhile
string = "0123456789ABCDEFG"
''.join(string[i] for i in takewhile(lambda x: x < len(string), accumulate(count())))
# '0136AF'
答案 1 :(得分:0)
您需要生成三角形数字(感谢@kevin),然后获取索引,如果得到IndexError
(已到达字符串的末尾),则返回
def triangles():
# could be improved with itertools.count
count = 1
index = 0
while True:
yield index
index += count
count += 1
def get_tri_indices(s):
res = []
for index in triangles():
try:
res.append(s[index])
except IndexError: # we're out of range
return ''.join(res)
输出
get_tri_indices('0123456789abcdef') # --> 0136af
答案 2 :(得分:0)
经过一些试验,这是明确的itertools
滥用答案。
>>> from itertools import accumulate, count, takewhile
>>> from operator import itemgetter
>>>
>>> def accuchars(s):
... idx = takewhile(lambda x: x < len(s), accumulate(count()))
... return ''.join(itemgetter(*idx)(s))
...
>>> my_string = "0123456789ABCDEFG"
>>> accuchars(my_string)
'0136AF'
答案 3 :(得分:0)
可以使用累加toolz并添加运算符
from toolz import accumulate
from operator import add
my_string = "0123456789ABCDEFG"
''.join([my_string[i] for i in accumulate(add,range(len(my_string))) if i <len(my_string)])
输出
'0136AF'
答案 4 :(得分:0)
要生成的数字序列是triangular number,其中每个n+1
是0..n
的总和。要获取数字列表,您可以迭代并将其相加,但也可以使用列表推导生成它。公式n(n+1)/2
给出了第 n 个三角数,因此
[n*(n+1)//2 for n in range(20)]
>>> [0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78, 91, 105, 120, 136, 153, 171, 190]
但是在使用此功能之前,您需要知道字符串长度的 final 号。您不能为range
插入任何足够大的数字,否则Python会抱怨
IndexError: string index out of range
因此您需要reverse of the formula;这将为您提供 m 值,其中 Tri ( m )≤len(string)
:
[x*(x+1)//2 for x in range(int(((1+8*len(my_string))**0.5)/2+.999))]
>>> [0, 1, 3, 6, 10, 15]
现在,您有了一种可靠的方法来仅生成所需的索引,因此可以抓取字符
[my_string[x*(x+1)//2] for x in range(int(((1+8*len(my_string))**0.5)/2+.999))]
>>> ['0', '1', '3', '6', 'A', 'F']
...并将它们一起整合到一个列表中:
print (''.join(my_string[x*(x+1)//2] for x in range(int(((1+8*len(my_string))**0.5)/2+.999))))
>>> 0136AF