gpt4 book ai didi

python - 用字符串列表替换字符串元素,使用它们的索引

转载 作者:太空宇宙 更新时间:2023-11-03 12:53:56 25 4
gpt4 key购买 nike

我必须构建的函数是用(数字值 * 下一个字符)替换字符串中的数字。

因此,foo = '2 hs4q q2w2 ' 将变为 ' hsqqqq qww '(注意空格)

假设 - 数字不能为零。

我获取了数字的(索引,值)和下一个字符。使用该信息获取我需要放回字符串中的子字符串:

foo = '2 hs4q q2w2 '

parameters=[(int(foo_list[b]),b+1) for b in range(len(foo_list)) if foo_list[b].isdigit()]
parameters # list of tuples (digit,charindex to be extended)
#[(2, 1), (4, 5), (2, 9), (2, 11)]

for p,i in parameters:
hoo=p*foo[i]
print (hoo,type(hoo))

#Out
<class 'str'> # Two spaces
qqqq <class 'str'>
ww <class 'str'>
<class 'str'> # Two spaces

如何在处理相似字符串的循环中使用所有这些信息?我知道字符串是不可变的,因此必须为每个插入/替换创建一个新的 str 对象。此外,索引值会随着循环运行而变化。

解决后的评论-

感谢大家提供四种不同的解决方案,这里供没有使用过yield from, yield的人引用 - In practice, what are the main uses for the new “yield from” syntax in Python 3.3?

最佳答案

个位数

您可以使用 str.isdigit 检查一个字符是否为数字,如果是则将其转换为 int 并将其与下一个字符相乘。这个逻辑可以写成给 str.join 的生成器。

代码

def expand_string(s):
return ''.join([(int(c) - 1) * s[i+1] if c.isdigit() else c for i, c in enumerate(s)])

例子

foo = '2 hs4q q2w2 '
print(expand_string(foo)) # ' hsqqqq qww '

尽管如此,对于多位数字的字符串,如 f10o',上面的代码失败了。

多位数

如果您还想考虑多位数字,您可以编写一个生成器函数,使用 itertools.groupby 将数字组合在一起。

代码

from itertools import groupby

def group_digits(s):
for isdigit, group in groupby(s, str.isdigit):
yield from [''.join(group)] if isdigit else group

def expand_string(s):
s = list(group_digits(s))
return ''.join((int(c) - 1) * s[i+1] if c.isdigit() else c for i, c in enumerate(s))

例子

foo = 'f10o'
print(expand_string(foo)) # 'foooooooooo'

关于python - 用字符串列表替换字符串元素,使用它们的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50548122/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com