返回带有第一个字母的字符串,然后从第一个字母返回一个字母索引,然后从第二个字母返回一个字母2索引,依此类推?

时间:2018-11-06 15:53:24

标签: python string

我正在尝试创建一个函数,该函数可以接受任意长度的字符串,然后接受具有第一个字母的字符串,然后接受第一个字母的字母一个索引,然后接受第二个字母的字母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)

5 个答案:

答案 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+10..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