我正在尝试编写函数remove_duplicates
以仅返回列表输入中的唯一值。我试图提出一些代码,但它抛出无限循环错误。我无法理解为什么。目标不是达到结果,因为我发现有直接的方法,如' SET'去做这个。但是,我主要想了解我的错误,因为这是我的第一语言,也是任何编码的第一天。
def remove_duplicates(x):
z = [x[0]]
for i in range(1,len(x)):
y = i-1
k = 0
while y >= 0:
if x[i] == x[y]:
k = k + 1
y -= 1
else:
break
if k == 0:
z.append(x[i])
return z
答案 0 :(得分:17)
使用内置的python集功能。
y = list(set(x))
y将是x的唯一元素列表。这可以在x中的元素可以在集合中使用时使用,因此它们必须实现__eq__()
和__hash__()
。
答案 1 :(得分:4)
如果你能使用
,它会很好SET运算符
从列表中删除重复的元素,如下所示:
.directive('mdInputContainer', mdInputContainer);
function mdInputContainer() {
return {
restrict: 'E',
require: 'mdInputContainer',
link: link
};
//////////////////////////////////////////////////////////////////
function link(scope, element, attrs, mdInputContainerCtrl) {
element.on('click', function () {
mdInputContainerCtrl.delegateClick();
});
}
}
现在是时候从这个列表中删除重复的元素了:
my_list = [1, 2, 3, 1, 1, 1, 1, 1, 2, 3, 4]
答案 2 :(得分:3)
您的代码的主要问题似乎在这里:
while y >= 0:
if x[i] == x[y]:
k = k + 1
y -= 1
在这里,只有当前元素匹配时才会递减y
,否则会进入无限循环。此外,您必须删除else: break
,否则您的添加循环将在列表中的第一个唯一元素之后(即在第一个元素之后)停止
如果你想坚持你最初的方法,你可以试试这个:
def remove_duplicates(x):
z = [x[0]]
for i in range(1,len(x)):
for y in range(0, i):
if x[i] == x[y]:
break
else:
z.append(x[i])
return z
但请注意, 有更简单的方法可以确保元素是唯一的。例如,您可以使用in
来检查当前元素是否已经存在于结果列表中,而不是单独检查每个元素。
def remove_duplicates(lst):
res = []
for x in lst:
if x not in res:
res.append(x)
return res
如果元素保证可以清洗,您也可以使用set
。但是不要return list(set(lst))
,因为这不会保留列表中元素的顺序。这比单词更多,但比使用x not in res
更快。
def remove_duplicates(lst):
seen = set()
res = []
for x in lst:
if x not in seen:
res.append(x)
seen.add(x)
return res
如果你想要这样的单行,你可以使用OrderedDict
:
import collections
def remove_duplicates(lst):
return collections.OrderedDict(zip(lst, lst)).values()