使用更改的迭代器进行循环

时间:2019-08-21 23:09:19

标签: python-3.x

在运行迭代器时,我不能使其更短。

我想编写一个获取字符串并删除其中重复序列的函数。 例如: 如果a具有字符串aaaaabbbbbbbcccccccDDDDDDaaaaa 我应该得到回报abcDa

我尝试使用for循环遍历字符串,每次看到一个新字母时,我都会将该字母保存在一个变量中,该变量加起来就是固定的字符串。

def string_sequence_fixing(string):
    c = ''
    for char in my_str:
        if c != char:
            c = char
        else:
            my_str = my_str.replace(c, '', my_str.count(c) - 1)
    return my_str

我要避免的问题是迭代次数过多。 当我看到一个新角色时,我想删除该角色的所有其他顺序, 但末尾的第二行不会更新for循环中的“条件”。

2 个答案:

答案 0 :(得分:0)

简短的回答:循环不会那样工作。
更长的答案:
以下是一些简单的伪代码,供您细读:
j=99 print "J is " j for j=0;20;5 print j \t end print "Now J is " j

输出可能会让您感到惊讶。
run J is 99 0 5 10 15 20 Now J is 99

原因是:循环中的变量j不是循环中的j变量。
我喜欢使用“堆栈”一词(某些语言声称它们不使用堆栈。在那种情况下,我称其为“非堆栈堆栈”。简单的堆栈表示内存中的临时存储空间。 初始变量“ j”进入“程序数据空间”。循环变量“ j”进入“堆栈数据空间”。

使用变量并不“真的”意味着您正在使用变量,它只是内存空间的助记符。让我们再看看该示例代码:
pointer-to-program-space-variable-named-j = 99 (poke into memory location 1:4500) pointer-to-stack-space-variable-named-j = 0 (poke into memory location 87:300) print pointer-to-stack-space-variable-named-j followed by tab increment pointer-to-stack-space-variable-named-j by 5 repeat until pointer-to-stack-space-variable-named-j = 20 print pointer-to-program-space-variable-named-j

有了这些知识,让我们看一下代码,看看发生了什么事情:
def string_sequence_fixing(string): c = '' for char in *STACK*.my_str: if c != char: c = char else: my_str = my_str.replace(c, '', *PROGRAM*.my_str.count(c) - 1) return my_str

看看它们是如何不同的变量?永远不要假设循环变量和程序变量相同。您需要重做算法才能完成想要做的事情。

另外,请参阅@David Cullen提供的链接。

答案 1 :(得分:0)

您可以使用groupby()中的itertools。代码如下:

data = 'aaabbbcccDDDDDEfggghiij'

from itertools import groupby
dataN = ''
for d in groupby(data):
    dataN += d[0]

print(dataN)

输出:

abcDEfghij
相关问题