如何返回按字母顺序排列的子字符串?

2024-10-06 07:08:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试编写一个函数,它将字符串s作为输入,并返回s中按字母顺序排列的子字符串列表。例如,s = 'acegibdh'应该返回['acegi', 'bdh']。你知道吗

下面是我想到的代码:

s = 'acegibdh'
ans = []
subs = []
i = 0
while i != len(s) - 1:
    while s[i] < s[i+1]:
        subs.append(s[i])
        i += 1
    if s[i] > s[i-1]:
        subs.append(s[i])
        i += 1
    subs = ''.join(subs)
    ans.append(subs)
    subs = []
print ans 

由于i+1测试超出了索引范围,它在处理字符串的最后一个字母时一直遇到问题。我花了很长时间来修补它,试图想出一种方法来避免这个问题。有人知道怎么做吗?你知道吗


Tags: 函数字符串代码列表lenif字母subs
3条回答

为什么不把第一个字母硬编码成ans,然后只处理字符串的其余部分呢?您只需迭代字符串本身,而不必使用索引。你知道吗

>>> s = 'acegibdh'
>>> ans = []
>>> ans.append(s[0])
>>> for letter in s[1:]:
...     if letter >= ans[-1][-1]:
...             ans[-1] += letter
...     else:
...             ans.append(letter)
...
>>> ans
['acegi', 'bdh']
s = 'acegibdh'
ans = []
subs = []
subs.append(s[0])
for x in range(len(s)-1):
    if s[x] <= s[x+1]:
        subs.append(s[x+1])
    if s[x] > s[x+1]:
        subs = ''.join(subs)
        ans.append(subs)
        subs = []
        subs.append(s[x+1])
subs = ''.join(subs)
ans.append(subs)
print ans 

我决定把你的代码改一下如果你有任何问题请告诉我

只是为了好玩,一个单线解决方案。你知道吗

>>> s='acegibdh'
>>> [s[l:r] for l,r in (lambda seq:zip(seq,seq[1:]))([0]+[idx+1 for idx in range(len(s)-1) if s[idx]>s[idx+1]]+[len(s)])]
['acegi', 'bdh']

相关问题 更多 >