在Python中删除字符串中的重复项而不使用临时缓冲区
我想用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
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