创建包含重复项的列表

时间:2020-10-19 18:17:17

标签: python list duplicates

在我的案例“ 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')**

我只是不明白所缺少的是什么。有人可以帮助我吗? 问候,迈克

3 个答案:

答案 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是字符串的别名,或者是正确实现insorted工作所需的各种比较器的对象-如果没有,那可能是另外一个问题!但是,如果没有看到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.namecountkey = 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']