基本排序/排序算法

2024-09-29 21:36:28 发布

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

试图实现并形成一个非常简单的算法。此算法接收字母或数字序列。它首先用每个字符或数字创建一个数组(列表)。然后,它将检查每个单独的字符,并将其与序列中的以下字符进行比较。如果两者相等,则从数组中删除该字符

例如输入:12223344112233或aaaabbbcccddaabb

输出应为:1234123或ABCDAB

我相信这个问题源于我创建了一个计数器并增加了每个循环。我使用这个计数器作为数组中的索引标记进行比较。尽管如此,每次我从数组中删除一个项时,它都会在计数器增加的同时更改索引

以下是我的代码:

def sort(i):
    iter = list(i)
    counter = 0
    for item in iter:
        if  item == iter[counter + 1]:
            del iter[counter]
        counter = counter + 1
    return iter

Tags: 标记算法列表字母counter计数器序列数字
3条回答

另一个回答很好。这个函数反向遍历列表以防止跳过项,并使用前面描述的前瞻类型算法。这并不是一个排序算法

def sort(input_str: str) -> str:
    as_list = list(input_str)
    for idx in range(len(as_list), 0, -1)):
        if item == as_list[idx-1]:
            del as_list[idx]
    return ''.join(as_list)

一些替代方案,都使用s = 'AAAABBBCCCDDAAABB'作为设置:

>>> import re
>>> re.sub(r'(.)\1+', r'\1', s)
'ABCDAB'
>>> p = None
>>> [c for c in s if p != (p := c)]
['A', 'B', 'C', 'D', 'A', 'B']
>>> [c for c, p in zip(s, [None] + list(s)) if c != p]
['A', 'B', 'C', 'D', 'A', 'B']
>>> [c for i, c in enumerate(s) if not s.endswith(c, None, i)]
['A', 'B', 'C', 'D', 'A', 'B']

您正在迭代要从中删除的同一个列表。这通常会导致你意想不到的行为。将清单复印一份&;再重复一遍

但是,有一个更简单的解决方案:使用^{}

import itertools

def sort(i):
    return [x for x, _ in itertools.groupby(list(i))]


print(sort('12223344112233'))

输出:

['1', '2', '3', '4', '1', '2', '3']

相关问题 更多 >

    热门问题