在我的案例“ getDuplicatesAlphabetical”中,我正在实现一个过程,该过程获取一个人对象列表并返回一个元组,其中包含多次出现的所有名称 在这里。
这是我到目前为止所拥有的:
def getDuplicatesAlphabetical(listOfPersonObjects):
l = []
dup = []
for person in listOfPersonObjects:
if person not in l:
l.append(person)
else:
dup.append(person)
return sorted(dup)
getDuplicatesAlphabetical(toObjectList(['Thomas', 'Michael', 'Thomas','Susanne','Michael','Thomas','Alfred','Alfred']))
#shall output: ('Alfred', 'Michael', 'Thomas')**
我只是不明白所缺少的是什么。有人可以帮助我吗? 问候,迈克
答案 0 :(得分:0)
您的代码不会检查该项目是否已经在dup
中。一个简单的解决方法是添加:
if person in dup:
continue
或将else
更改为:
elif person not in dup:
dup.append(person)
FWIW计数项目(例如查找重复项)更简单的方法是collections.Counter
:
>>> from collections import Counter
>>> def get_dupes_sorted(names):
... return sorted(name for name, count in Counter(names).items() if count > 1)
...
>>> get_dupes_sorted(['Thomas', 'Michael', 'Thomas', 'Susanne', 'Michael', 'Thomas', 'Alfred', 'Alfred'])
['Alfred', 'Michael', 'Thomas']
对于大型数据集,使用Counter
还比使用列表更快,因为它内部使用字典。检查某项是否为in
时,列表需要扫描整个列表(因此,当列表变大时,它会变慢,即“线性时间”),而在字典或集合中查找某项则花费相同的时间(即“恒定时间”),而不管还有多少其他项目。
我假设personObject
是字符串的别名,或者是正确实现in
和sorted
工作所需的各种比较器的对象-如果没有,那可能是另外一个问题!但是,如果没有看到toObjectList
的实现,就无法调试它。
答案 1 :(得分:0)
这就是set
的作用!检查项目是否存在于集合中much cheaper O(1)比检查项目是否存在于列表O(n)中。另一个好处是,添加集合中已经存在的元素实际上并不会重复它。
def getDuplicatesAlphabetical(listOfPersonObjects):
l = set()
dup = set()
for person in listOfPersonObjects:
if person not in l:
l.add(person)
else:
dup.add(person)
return sorted(list(dup))
测试一下,我们得到
getDuplicatesAlphabetical(toObjectList(['Thomas', 'Michael', 'Thomas','Susanne','Michael','Thomas','Alfred','Alfred']))
# Output: ['Alfred', 'Michael', 'Thomas']
另一种方法是计算所有名称的实例,并返回出现多个实例的实例。您可以为此使用内置的collections.Counter
,也可以自己使用。
def getDuplicatesAlphabetical(listOfPersonObjects):
counts = {}
for person in listOfPersonObjects:
countkey = person
counts[countkey] = counts.get(countkey, 0) + 1
return sorted([name for name, count in counts.items() if count > 1])
请记住,dict
键只能是不可变的对象,因此,如果listOfPersonObjects
具有可变元素,则必须执行类似countkey = person.name
或countkey = person['name']
答案 2 :(得分:-1)
首先删除 listOfObject()函数。尚未定义。 然后更改如下的if语句
if listOfPersonObjects.count(person)>1:
if person in dup:
l.append(person)
else:
dup.append(person)
输出:['Alfred', 'Michael', 'Thomas']