在Python中删除字符串中的重复项而不使用临时缓冲区

在Python中删除字符串中的重复项而不使用临时缓冲区,python,string,Python,String,我想用Python解决这个问题: given a string (without spacing), remove the duplicates without using an adittional buffer. 我有以下代码: def removedup(st): temp = [] for i in range(len(st)): if st[i] not in temp: temp.append(st[i]) return

我想用Python解决这个问题:

given a string (without spacing), remove the duplicates without using an adittional buffer.
我有以下代码:

 def removedup(st):
 temp = []
 for i in range(len(st)):
         if st[i] not in temp:
                 temp.append(st[i])
 return temp
它返回一个没有重复项的列表

1-这是O(n^2)中的代码,对吗

2-如何在不使用python中的额外缓冲区的情况下执行相同的操作??(我的意思是不使用列表)。也许我可以使用字符串(而不是列表),但不确定这是否会增加复杂性。另外,python中的字符串是不可变的,所以我无法通过某种类型的索引来更改某些内容。(如C++或java)。< /P> 用Python解决这个问题的最佳方法是什么?我知道这里有一些“看起来”重复的问题,但我的问题与Python更相关(在没有额外缓冲区的情况下解决这个问题)

谢谢大家!

是的

2) 嗯

..是迄今为止对字符串(或任何iterable)进行唯一化的最简单方法。我不知道你是否认为这是“额外的缓冲”。由于字符串如您所说是不可变的,所以需要以任何方式为另一个对象分配一些额外的内存

这当然不能维持秩序,如果这是一个问题,那么总是有一个非常明显的问题:

from collections import OrderedDict

return ''.join(OrderedDict.fromkeys(st))
1) 对

2) 嗯

..是迄今为止对字符串(或任何iterable)进行唯一化的最简单方法。我不知道你是否认为这是“额外的缓冲”。由于字符串如您所说是不可变的,所以需要以任何方式为另一个对象分配一些额外的内存

这当然不能维持秩序,如果这是一个问题,那么总是有一个非常明显的问题:

from collections import OrderedDict

return ''.join(OrderedDict.fromkeys(st))
0)显然,您必须使用至少一个额外的缓冲区,因为正如您所提到的,python字符串是不可变的,您至少需要以某种方式返回结果,对吗?因此,内部至少已经使用了一个缓冲区(即使您使用相同的名称命名它)

当然,您可以使用string作为缓冲区,它们可以执行string+string或string+=string,甚至string[:n-1]+string[n:],但由于不可变,它每次都会在内部创建新对象

您可以使用一些其他的、可变的、iterable来代替字符串,这样它就可以工作了

1) 不,您的代码不是O(N**2)。在最坏的情况下是O(N*log(N))(所有符号都是唯一的),在最好的情况下是O(N)(所有符号都只是一个符号)

2) 假设您使用list而不是string of string,您可以执行以下操作:

def dup_remove(lst):
    i = 0
    n = len(lst)
    while i < n:
        if lst[i] in lst[:i]:
            del lst[i]
            n -= 1
        else:
            i += 1
        return lst
def dup_remove(lst):
i=0
n=长度(lst)
而i
在最坏的情况下,它仍然是O(N*Log(N)),但它不使用任何额外的缓冲区,这正是您首先想要的。我认为,出于实际目的,使用OrderedDict的解决方案应该更为优化。

0)显然,您必须使用至少一个额外的缓冲区,因为正如您所提到的,python字符串是不可变的,您至少需要以某种方式返回结果,对吗?因此,内部至少已经使用了一个缓冲区(即使您使用相同的名称命名它)

当然,您可以使用string作为缓冲区,它们可以执行string+string或string+=string,甚至string[:n-1]+string[n:],但由于不可变,它每次都会在内部创建新对象

您可以使用一些其他的、可变的、iterable来代替字符串,这样它就可以工作了

1) 不,您的代码不是O(N**2)。在最坏的情况下是O(N*log(N))(所有符号都是唯一的),在最好的情况下是O(N)(所有符号都只是一个符号)

2) 假设您使用list而不是string of string,您可以执行以下操作:

def dup_remove(lst):
    i = 0
    n = len(lst)
    while i < n:
        if lst[i] in lst[:i]:
            del lst[i]
            n -= 1
        else:
            i += 1
        return lst
def dup_remove(lst):
i=0
n=长度(lst)
而i

在最坏的情况下,它仍然是O(N*Log(N)),但它不使用任何额外的缓冲区,这正是您首先想要的。我认为,出于实际目的,使用OrderedDict的解决方案应该更为优化。

另一种方法是通过列表切片循环来实现

# O(n ^ 2)
for item in input_list[:]:
    index = input_list.index(item) + 1
    while index < len(input_list):
        if input_list[index] == item:
            del input_list[index]
        index += 1
#O(n^2)
对于输入列表[:]中的项目:
索引=输入列表。索引(项目)+1
索引
因为slice创建了一个副本,所以如果您真的想要一个没有任何内部缓冲区的解决方案,这就可以了

# O(n ^ 2)
i = 0
while i < len(input_list):
    j = i + 1
    while j < len(input_list):
        if input_list[j] == input_list[i]:
            del input_list[j]
            # Don't increment j here since the next item
            # after the deleted one will move to index j
        else:
            j += 1
    i += 1
#O(n^2)
i=0
当i
另一种通过列表切片循环实现的方法

# O(n ^ 2)
for item in input_list[:]:
    index = input_list.index(item) + 1
    while index < len(input_list):
        if input_list[index] == item:
            del input_list[index]
        index += 1
#O(n^2)
对于输入列表[:]中的项目:
索引=输入列表。索引(项目)+1
索引
因为slice创建了一个副本,所以如果您真的想要一个没有任何内部缓冲区的解决方案,这就可以了

# O(n ^ 2)
i = 0
while i < len(input_list):
    j = i + 1
    while j < len(input_list):
        if input_list[j] == input_list[i]:
            del input_list[j]
            # Don't increment j here since the next item
            # after the deleted one will move to index j
        else:
            j += 1
    i += 1
#O(n^2)
i=0
当i
2) 下面是一种非常有效的方法。请注意,我不使用任何附加包。我甚至不使用列表,只是一个字符串

def removeDuplicate (input):   

i = 0
while i < len(input)-1:
    j = i + 1
    while j < len(input):
        if input[j] == input[i]:                
            input_list = input_list[0:j] + input_list[j+1:]                
            # Don't increment j here since the next item
            # after the deleted one will move to index j
        else:
            j += 1
    i += 1

return input
def移除副本(输入):
i=0
当i