Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在列表中找到重复项并用它们创建另一个列表?_Python_List_Duplicates - Fatal编程技术网

Python 如何在列表中找到重复项并用它们创建另一个列表?

Python 如何在列表中找到重复项并用它们创建另一个列表?,python,list,duplicates,Python,List,Duplicates,如何在Python列表中找到重复项并创建另一个重复项列表?列表仅包含整数。要删除重复项,请使用set(a)。要打印副本,请执行以下操作: a = [1,2,3,2,1,5,6,5,5,5] import collections print([item for item, count in collections.Counter(a).items() if count > 1]) ## [1, 2, 5] 请注意,计数器不是特别有效()并且可能在这里使用过度设置将执行得更好。此代码按源

如何在Python列表中找到重复项并创建另一个重复项列表?列表仅包含整数。

要删除重复项,请使用
set(a)
。要打印副本,请执行以下操作:

a = [1,2,3,2,1,5,6,5,5,5]

import collections
print([item for item, count in collections.Counter(a).items() if count > 1])

## [1, 2, 5]
请注意,
计数器
不是特别有效()并且可能在这里使用过度<代码>设置将执行得更好。此代码按源代码顺序计算唯一元素的列表:

seen = set()
uniq = []
for x in a:
    if x not in seen:
        uniq.append(x)
        seen.add(x)
或者,更简洁地说:

seen = set()
uniq = [x for x in a if x in seen or seen.add(x)]    
我不推荐后一种样式,因为不清楚
没有看到的内容。add(x)
正在做什么(set
add()
方法总是返回
None
,因此需要
not

要计算不带库的重复元素列表,请执行以下操作:

seen = {}
dupes = []

for x in a:
    if x not in seen:
        seen[x] = 1
    else:
        if seen[x] == 1:
            dupes.append(x)
        seen[x] += 1
l = [1,2,3,2,1,5,6,5,5,5]

res = [(x, count) for x, g in groupby(sorted(l)) if (count := len(list(g))) > 1]

print(res)
如果列表元素不可散列,则不能使用set/dict,并且必须求助于二次时间解决方案(对每个元素进行比较)。例如:

a = [[1], [2], [3], [1], [5], [3]]

no_dupes = [x for n, x in enumerate(a) if x not in a[:n]]
print no_dupes # [[1], [2], [3], [5]]

dupes = [x for n, x in enumerate(a) if x in a[:n]]
print dupes # [[1], [3]]

collections.Counter在python 2.7中是新的:


Python 2.5.4 (r254:67916, May 31 2010, 15:03:39) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-46)] on linux2
a = [1,2,3,2,1,5,6,5,5,5]
import collections
print [x for x, y in collections.Counter(a).items() if y > 1]
Type "help", "copyright", "credits" or "license" for more information.
  File "", line 1, in 
AttributeError: 'module' object has no attribute 'Counter'
>>> 
在早期版本中,您可以使用传统的dict:

a = [1,2,3,2,1,5,6,5,5,5]
d = {}
for elem in a:
    if elem in d:
        d[elem] += 1
    else:
        d[elem] = 1

print [x for x, y in d.items() if y > 1]

您不需要计数,只需要知道是否以前见过该项目。适应这个问题:

def list_duplicates(seq):
  seen = set()
  seen_add = seen.add
  # adds all elements it doesn't know yet to seen and all other to seen_twice
  seen_twice = set( x for x in seq if x in seen or seen_add(x) )
  # turn the set into a list (as requested)
  return list( seen_twice )

a = [1,2,3,2,1,5,6,5,5,5]
list_duplicates(a) # yields [1, 2, 5]

为了防止速度问题,以下是一些时间安排:

# file: test.py
import collections

def thg435(l):
    return [x for x, y in collections.Counter(l).items() if y > 1]

def moooeeeep(l):
    seen = set()
    seen_add = seen.add
    # adds all elements it doesn't know yet to seen and all other to seen_twice
    seen_twice = set( x for x in l if x in seen or seen_add(x) )
    # turn the set into a list (as requested)
    return list( seen_twice )

def RiteshKumar(l):
    return list(set([x for x in l if l.count(x) > 1]))

def JohnLaRooy(L):
    seen = set()
    seen2 = set()
    seen_add = seen.add
    seen2_add = seen2.add
    for item in L:
        if item in seen:
            seen2_add(item)
        else:
            seen_add(item)
    return list(seen2)

l = [1,2,3,2,1,5,6,5,5,5]*100
以下是结果:(干得好@johnlaroy!)

有趣的是,除了计时本身,当使用pypy时,排名也会略有变化。最有趣的是,基于计数器的方法从pypy的优化中受益匪浅,而我建议的方法缓存方法似乎几乎没有效果

$ pypy -mtimeit -s 'import test' 'test.JohnLaRooy(test.l)'
100000 loops, best of 3: 17.8 usec per loop
$ pypy -mtimeit -s 'import test' 'test.thg435(test.l)'
10000 loops, best of 3: 23 usec per loop
$ pypy -mtimeit -s 'import test' 'test.moooeeeep(test.l)'
10000 loops, best of 3: 39.3 usec per loop
显然,这种效果与输入数据的“重复性”有关。我已经为xrange(10000)中的I设置了
l=[random.randrange(1000000)]
并得到了以下结果:

$ pypy -mtimeit -s 'import test' 'test.moooeeeep(test.l)'
1000 loops, best of 3: 495 usec per loop
$ pypy -mtimeit -s 'import test' 'test.JohnLaRooy(test.l)'
1000 loops, best of 3: 499 usec per loop
$ pypy -mtimeit -s 'import test' 'test.thg435(test.l)'
1000 loops, best of 3: 1.68 msec per loop

有点晚了,但可能对一些人有帮助。 对于一个更大的列表,我发现这对我很有用

l=[1,2,3,5,4,1,3,1]
s=set(l)
d=[]
for x in l:
    if x in s:
        s.remove(x)
    else:
        d.append(x)
d
[1,3,1]
仅显示所有副本并保留顺序。

单行解决方案:

set([i for i in list if sum([1 for a in list if a == i]) > 1])

我在查看相关内容时遇到了这个问题,我想知道为什么没有人提供基于生成器的解决方案?解决这个问题需要:

>>> print list(getDupes_9([1,2,3,2,1,5,6,5,5,5]))
[1, 2, 5]
我很关心可伸缩性,所以测试了几种方法,包括在小列表上运行良好的幼稚项目,但随着列表变大,其可伸缩性会变得可怕(注意——使用timeit会更好,但这是说明性的)

我加入了@moooeep进行比较(速度惊人:如果输入列表是完全随机的,则速度最快),还有一个itertools方法,对于大多数排序的列表,速度甚至更快。。。现在包括来自@firelynx的熊猫方法——速度慢,但不可怕,而且简单。注意-在我的机器上,排序/tee/zip方法对于大部分排序的大型列表始终是最快的,moooeeep对于无序列表是最快的,但您的里程数可能会有所不同

优势

a=[1,2,3,3,3]
dup=[]
for each in a:
  if each not in dup:
    dup.append(each)
print(dup)
a=[1,2,3,3,3]
uniques=[]
dups=[]

for each in a:
  if each not in uniques:
    uniques.append(each)
  else:
    dups.append(each)
print("Unique values are below:")
print(uniques)
print("Duplicate values are below:")
print(dups)
  • 使用相同的代码非常快速、简单地测试“任意”重复项
假设

a=[1,2,3,3,3]
dup=[]
for each in a:
  if each not in dup:
    dup.append(each)
print(dup)
a=[1,2,3,3,3]
uniques=[]
dups=[]

for each in a:
  if each not in uniques:
    uniques.append(each)
  else:
    dups.append(each)
print("Unique values are below:")
print(uniques)
print("Duplicate values are below:")
print(dups)
  • 重复项只能报告一次
  • 重复订单不需要保留
  • 重复项可能位于列表中的任何位置

最快的解决方案,100万个条目:

def getDupes(c):
        '''sort/tee/izip'''
        a, b = itertools.tee(sorted(c))
        next(b, None)
        r = None
        for k, g in itertools.izip(a, b):
            if k != g: continue
            if k != r:
                yield k
                r = k

测试的方法

import itertools
import time
import random

def getDupes_1(c):
    '''naive'''
    for i in xrange(0, len(c)):
        if c[i] in c[:i]:
            yield c[i]

def getDupes_2(c):
    '''set len change'''
    s = set()
    for i in c:
        l = len(s)
        s.add(i)
        if len(s) == l:
            yield i

def getDupes_3(c):
    '''in dict'''
    d = {}
    for i in c:
        if i in d:
            if d[i]:
                yield i
                d[i] = False
        else:
            d[i] = True

def getDupes_4(c):
    '''in set'''
    s,r = set(),set()
    for i in c:
        if i not in s:
            s.add(i)
        elif i not in r:
            r.add(i)
            yield i

def getDupes_5(c):
    '''sort/adjacent'''
    c = sorted(c)
    r = None
    for i in xrange(1, len(c)):
        if c[i] == c[i - 1]:
            if c[i] != r:
                yield c[i]
                r = c[i]

def getDupes_6(c):
    '''sort/groupby'''
    def multiple(x):
        try:
            x.next()
            x.next()
            return True
        except:
            return False
    for k, g in itertools.ifilter(lambda x: multiple(x[1]), itertools.groupby(sorted(c))):
        yield k

def getDupes_7(c):
    '''sort/zip'''
    c = sorted(c)
    r = None
    for k, g in zip(c[:-1],c[1:]):
        if k == g:
            if k != r:
                yield k
                r = k

def getDupes_8(c):
    '''sort/izip'''
    c = sorted(c)
    r = None
    for k, g in itertools.izip(c[:-1],c[1:]):
        if k == g:
            if k != r:
                yield k
                r = k

def getDupes_9(c):
    '''sort/tee/izip'''
    a, b = itertools.tee(sorted(c))
    next(b, None)
    r = None
    for k, g in itertools.izip(a, b):
        if k != g: continue
        if k != r:
            yield k
            r = k

def getDupes_a(l):
    '''moooeeeep'''
    seen = set()
    seen_add = seen.add
    # adds all elements it doesn't know yet to seen and all other to seen_twice
    for x in l:
        if x in seen or seen_add(x):
            yield x

def getDupes_b(x):
    '''iter*/sorted'''
    x = sorted(x)
    def _matches():
        for k,g in itertools.izip(x[:-1],x[1:]):
            if k == g:
                yield k
    for k, n in itertools.groupby(_matches()):
        yield k

def getDupes_c(a):
    '''pandas'''
    import pandas as pd
    vc = pd.Series(a).value_counts()
    i = vc[vc > 1].index
    for _ in i:
        yield _

def hasDupes(fn,c):
    try:
        if fn(c).next(): return True    # Found a dupe
    except StopIteration:
        pass
    return False

def getDupes(fn,c):
    return list(fn(c))

STABLE = True
if STABLE:
    print 'Finding FIRST then ALL duplicates, single dupe of "nth" placed element in 1m element array'
else:
    print 'Finding FIRST then ALL duplicates, single dupe of "n" included in randomised 1m element array'
for location in (50,250000,500000,750000,999999):
    for test in (getDupes_2, getDupes_3, getDupes_4, getDupes_5, getDupes_6,
                 getDupes_8, getDupes_9, getDupes_a, getDupes_b, getDupes_c):
        print 'Test %-15s:%10d - '%(test.__doc__ or test.__name__,location),
        deltas = []
        for FIRST in (True,False):
            for i in xrange(0, 5):
                c = range(0,1000000)
                if STABLE:
                    c[0] = location
                else:
                    c.append(location)
                    random.shuffle(c)
                start = time.time()
                if FIRST:
                    print '.' if location == test(c).next() else '!',
                else:
                    print '.' if [location] == list(test(c)) else '!',
                deltas.append(time.time()-start)
            print ' -- %0.3f  '%(sum(deltas)/len(deltas)),
        print
    print
“所有重复”测试的结果是一致的,在该阵列中发现“第一个”重复,然后是“所有”重复:

Finding FIRST then ALL duplicates, single dupe of "nth" placed element in 1m element array
Test set len change :    500000 -  . . . . .  -- 0.264   . . . . .  -- 0.402  
Test in dict        :    500000 -  . . . . .  -- 0.163   . . . . .  -- 0.250  
Test in set         :    500000 -  . . . . .  -- 0.163   . . . . .  -- 0.249  
Test sort/adjacent  :    500000 -  . . . . .  -- 0.159   . . . . .  -- 0.229  
Test sort/groupby   :    500000 -  . . . . .  -- 0.860   . . . . .  -- 1.286  
Test sort/izip      :    500000 -  . . . . .  -- 0.165   . . . . .  -- 0.229  
Test sort/tee/izip  :    500000 -  . . . . .  -- 0.145   . . . . .  -- 0.206  *
Test moooeeeep      :    500000 -  . . . . .  -- 0.149   . . . . .  -- 0.232  
Test iter*/sorted   :    500000 -  . . . . .  -- 0.160   . . . . .  -- 0.221  
Test pandas         :    500000 -  . . . . .  -- 0.493   . . . . .  -- 0.499  
当列表首先被洗牌时,排序的价格变得明显-效率明显下降,@moooeeep方法占主导地位,set和dict方法相似,但:

Finding FIRST then ALL duplicates, single dupe of "n" included in randomised 1m element array
Test set len change :    500000 -  . . . . .  -- 0.321   . . . . .  -- 0.473  
Test in dict        :    500000 -  . . . . .  -- 0.285   . . . . .  -- 0.360  
Test in set         :    500000 -  . . . . .  -- 0.309   . . . . .  -- 0.365  
Test sort/adjacent  :    500000 -  . . . . .  -- 0.756   . . . . .  -- 0.823  
Test sort/groupby   :    500000 -  . . . . .  -- 1.459   . . . . .  -- 1.896  
Test sort/izip      :    500000 -  . . . . .  -- 0.786   . . . . .  -- 0.845  
Test sort/tee/izip  :    500000 -  . . . . .  -- 0.743   . . . . .  -- 0.804  
Test moooeeeep      :    500000 -  . . . . .  -- 0.234   . . . . .  -- 0.311  *
Test iter*/sorted   :    500000 -  . . . . .  -- 0.776   . . . . .  -- 0.840  
Test pandas         :    500000 -  . . . . .  -- 0.539   . . . . .  -- 0.540  

我会用熊猫做这个,因为我经常用熊猫

import pandas as pd
a = [1,2,3,3,3,4,5,6,6,7]
vc = pd.Series(a).value_counts()
vc[vc > 1].index.tolist()
给予


可能效率不高,但与其他许多答案相比,它的代码更少,因此我想我会贡献自己的力量,这是我必须做到的,因为我挑战自己不要使用其他方法:

def dupList(oldlist):
    if type(oldlist)==type((2,2)):
        oldlist=[x for x in oldlist]
    newList=[]
    newList=newList+oldlist
    oldlist=oldlist
    forbidden=[]
    checkPoint=0
    for i in range(len(oldlist)):
        #print 'start i', i
        if i in forbidden:
            continue
        else:
            for j in range(len(oldlist)):
                #print 'start j', j
                if j in forbidden:
                    continue
                else:
                    #print 'after Else'
                    if i!=j: 
                        #print 'i,j', i,j
                        #print oldlist
                        #print newList
                        if oldlist[j]==oldlist[i]:
                            #print 'oldlist[i],oldlist[j]', oldlist[i],oldlist[j]
                            forbidden.append(j)
                            #print 'forbidden', forbidden
                            del newList[j-checkPoint]
                            #print newList
                            checkPoint=checkPoint+1
    return newList
因此,您的示例的作用如下:

>>>a = [1,2,3,3,3,4,5,6,6,7]
>>>dupList(a)
[1, 2, 3, 4, 5, 6, 7]

接受答案的第三个示例给出了错误的答案,并且没有试图给出重复的答案。以下是正确的版本:

number_lst = [1, 1, 2, 3, 5, ...]

seen_set = set()
duplicate_set = set(x for x in number_lst if x in seen_set or seen_set.add(x))
unique_set = seen_set - duplicate_set

这里有很多答案,但我认为这相对来说是一种可读性强、易于理解的方法:

def get_duplicates(sorted_list):
    duplicates = []
    last = sorted_list[0]
    for x in sorted_list[1:]:
        if x == last:
            duplicates.append(x)
        last = x
    return set(duplicates)
注:

  • 如果您希望保留重复计数,请取消强制转换 在底部“设置”以获取完整列表
  • 如果您喜欢使用生成器,请将duplicates.append(x)替换为yield x,并在底部使用return语句(您可以稍后转换为set)

    • 这里有一个快速生成器,它使用dict将每个元素存储为一个键,并带有一个布尔值,用于检查是否已生成重复项

      对于包含所有可哈希类型元素的列表:

      def gen_dupes(array):
          unique = {}
          for value in array:
              if value in unique and unique[value]:
                  unique[value] = False
                  yield value
              else:
                  unique[value] = True
      
      array = [1, 2, 2, 3, 4, 1, 5, 2, 6, 6]
      print(list(gen_dupes(array)))
      # => [2, 1, 6]
      
      对于可能包含列表的列表:

      def gen_dupes(array):
          unique = {}
          for value in array:
              is_list = False
              if type(value) is list:
                  value = tuple(value)
                  is_list = True
      
              if value in unique and unique[value]:
                  unique[value] = False
                  if is_list:
                      value = list(value)
      
                  yield value
              else:
                  unique[value] = True
      
      array = [1, 2, 2, [1, 2], 3, 4, [1, 2], 5, 2, 6, 6]
      print(list(gen_dupes(array)))
      # => [2, [1, 2], 6]
      

      在Python中通过一次迭代查找重复项的非常简单和快速的方法是:

      testList = ['red', 'blue', 'red', 'green', 'blue', 'blue']
      
      testListDict = {}
      
      for item in testList:
        try:
          testListDict[item] += 1
        except:
          testListDict[item] = 1
      
      print testListDict
      
      输出如下:

      >>> print testListDict
      {'blue': 3, 'green': 1, 'red': 2}
      

      在我的博客中,这里有一个简洁明了的解决方案-

      for x in set(li):
          li.remove(x)
      
      li = list(set(li))
      
      使用熊猫:

      >>> import pandas as pd
      >>> a = [1, 2, 1, 3, 3, 3, 0]
      >>> pd.Series(a)[pd.Series(a).duplicated()].values
      array([1, 3, 3])
      
      您可以使用:

      或者,如果您只需要每个副本中的一个,则可以将其与以下内容结合使用:

      它还可以处理不易损坏的元素(但以性能为代价):

      这是只有少数其他方法可以处理的事情

      基准 我做了一个快速基准测试,包含了这里提到的大多数(但不是全部)方法

      第一个基准只包括一小部分列表长度,因为有些方法具有
      O(n**2)
      行为

      在图形中,y轴表示时间,因此值越小越好。它还绘制了日志,因此可以更好地显示广泛的值:

      删除
      O(n**2)
      方法我在列表中做了另一个基准测试,最多50万个元素:

      正如您所看到的,
      iteration\u实用程序。duplicates
      方法比任何其他方法都快,甚至链接
      unique\u everseed(duplicates(…)
      也比其他方法快或同样快

      还有一件有趣的事情需要注意
      >>> from iteration_utilities import unique_everseen
      
      >>> list(unique_everseen(duplicates([1,1,2,1,2,3,4,2])))
      [1, 2]
      
      >>> list(duplicates([[1], [2], [1], [3], [1]]))
      [[1], [1]]
      
      >>> list(unique_everseen(duplicates([[1], [2], [1], [3], [1]])))
      [[1]]
      
      from iteration_utilities import duplicates, unique_everseen
      from collections import Counter
      import pandas as pd
      import itertools
      
      def georg_counter(it):
          return [item for item, count in Counter(it).items() if count > 1]
      
      def georg_set(it):
          seen = set()
          uniq = []
          for x in it:
              if x not in seen:
                  uniq.append(x)
                  seen.add(x)
      
      def georg_set2(it):
          seen = set()
          return [x for x in it if x not in seen and not seen.add(x)]   
      
      def georg_set3(it):
          seen = {}
          dupes = []
      
          for x in it:
              if x not in seen:
                  seen[x] = 1
              else:
                  if seen[x] == 1:
                      dupes.append(x)
                  seen[x] += 1
      
      def RiteshKumar_count(l):
          return set([x for x in l if l.count(x) > 1])
      
      def moooeeeep(seq):
          seen = set()
          seen_add = seen.add
          # adds all elements it doesn't know yet to seen and all other to seen_twice
          seen_twice = set( x for x in seq if x in seen or seen_add(x) )
          # turn the set into a list (as requested)
          return list( seen_twice )
      
      def F1Rumors_implementation(c):
          a, b = itertools.tee(sorted(c))
          next(b, None)
          r = None
          for k, g in zip(a, b):
              if k != g: continue
              if k != r:
                  yield k
                  r = k
      
      def F1Rumors(c):
          return list(F1Rumors_implementation(c))
      
      def Edward(a):
          d = {}
          for elem in a:
              if elem in d:
                  d[elem] += 1
              else:
                  d[elem] = 1
          return [x for x, y in d.items() if y > 1]
      
      def wordsmith(a):
          return pd.Series(a)[pd.Series(a).duplicated()].values
      
      def NikhilPrabhu(li):
          li = li.copy()
          for x in set(li):
              li.remove(x)
      
          return list(set(li))
      
      def firelynx(a):
          vc = pd.Series(a).value_counts()
          return vc[vc > 1].index.tolist()
      
      def HenryDev(myList):
          newList = set()
      
          for i in myList:
              if myList.count(i) >= 2:
                  newList.add(i)
      
          return list(newList)
      
      def yota(number_lst):
          seen_set = set()
          duplicate_set = set(x for x in number_lst if x in seen_set or seen_set.add(x))
          return seen_set - duplicate_set
      
      def IgorVishnevskiy(l):
          s=set(l)
          d=[]
          for x in l:
              if x in s:
                  s.remove(x)
              else:
                  d.append(x)
          return d
      
      def it_duplicates(l):
          return list(duplicates(l))
      
      def it_unique_duplicates(l):
          return list(unique_everseen(duplicates(l)))
      
      from simple_benchmark import benchmark
      import random
      
      funcs = [
          georg_counter, georg_set, georg_set2, georg_set3, RiteshKumar_count, moooeeeep, 
          F1Rumors, Edward, wordsmith, NikhilPrabhu, firelynx,
          HenryDev, yota, IgorVishnevskiy, it_duplicates, it_unique_duplicates
      ]
      
      args = {2**i: [random.randint(0, 2**(i-1)) for _ in range(2**i)] for i in range(2, 12)}
      
      b = benchmark(funcs, args, 'list size')
      
      b.plot()
      
      funcs = [
          georg_counter, georg_set, georg_set2, georg_set3, moooeeeep, 
          F1Rumors, Edward, wordsmith, firelynx,
          yota, IgorVishnevskiy, it_duplicates, it_unique_duplicates
      ]
      
      args = {2**i: [random.randint(0, 2**(i-1)) for _ in range(2**i)] for i in range(2, 20)}
      
      b = benchmark(funcs, args, 'list size')
      b.plot()
      
      myList  = [2 ,4 , 6, 8, 4, 6, 12];
      newList = set()
      
      for i in myList:
          if myList.count(i) >= 2:
              newList.add(i)
      
      print(list(newList))
      ## [4 , 6]
      
      from itertools import groupby
      
      myList  = [2, 4, 6, 8, 4, 6, 12]
      # when the list is sorted, groupby groups by consecutive elements which are similar
      for x, y in groupby(sorted(myList)):
          #  list(y) returns all the occurences of item x
          if len(list(y)) > 1:
              print x  
      
      4
      6
      
      a=[1,2,3,3,3]
      dup=[]
      for each in a:
        if each not in dup:
          dup.append(each)
      print(dup)
      
      a=[1,2,3,3,3]
      uniques=[]
      dups=[]
      
      for each in a:
        if each not in uniques:
          uniques.append(each)
        else:
          dups.append(each)
      print("Unique values are below:")
      print(uniques)
      print("Duplicate values are below:")
      print(dups)
      
      set([x for x in l if l.count(x) > 1])
      
      def dups_count_dict(l):
          d = {}
      
          for item in l:
              if item not in d:
                  d[item] = 0
      
              d[item] += 1
      
          result_d = {key: val for key, val in d.iteritems() if val > 1}
      
          return result_d.keys()
      
      dups_count: 13.368s # this is a function which uses l.count()
      dups_count_dict: 0.014s # this is a final best function (of the 3 functions)
      dups_count_counter: 0.024s # collections.Counter
      
      import numpy as np
      from time import time
      from collections import Counter
      
      class TimerCounter(object):
          def __init__(self):
              self._time_sum = 0
      
          def start(self):
              self.time = time()
      
          def stop(self):
              self._time_sum += time() - self.time
      
          def get_time_sum(self):
              return self._time_sum
      
      
      def dups_count(l):
          return set([x for x in l if l.count(x) > 1])
      
      
      def dups_count_dict(l):
          d = {}
      
          for item in l:
              if item not in d:
                  d[item] = 0
      
              d[item] += 1
      
          result_d = {key: val for key, val in d.iteritems() if val > 1}
      
          return result_d.keys()
      
      
      def dups_counter(l):
          counter = Counter(l)    
      
          result_d = {key: val for key, val in counter.iteritems() if val > 1}
      
          return result_d.keys()
      
      
      
      def gen_array():
          np.random.seed(17)
          return list(np.random.randint(0, 5000, 10000))
      
      
      def assert_equal_results(*results):
          primary_result = results[0]
          other_results = results[1:]
      
          for other_result in other_results:
              assert set(primary_result) == set(other_result) and len(primary_result) == len(other_result)
      
      
      if __name__ == '__main__':
          dups_count_time = TimerCounter()
          dups_count_dict_time = TimerCounter()
          dups_count_counter = TimerCounter()
      
          l = gen_array()
      
          for i in range(3):
              dups_count_time.start()
              result1 = dups_count(l)
              dups_count_time.stop()
      
              dups_count_dict_time.start()
              result2 = dups_count_dict(l)
              dups_count_dict_time.stop()
      
              dups_count_counter.start()
              result3 = dups_counter(l)
              dups_count_counter.stop()
      
              assert_equal_results(result1, result2, result3)
      
          print 'dups_count: %.3f' % dups_count_time.get_time_sum()
          print 'dups_count_dict: %.3f' % dups_count_dict_time.get_time_sum()
          print 'dups_count_counter: %.3f' % dups_count_counter.get_time_sum()
      
      from toolz import frequencies, valfilter
      
      a = [1,2,2,3,4,5,4]
      >>> list(valfilter(lambda count: count > 1, frequencies(a)).keys())
      [2,4] 
      
          target=[1,2,3,4,4,4,3,5,6,8,4,3]
      
          duplicates=dict(set((x,target.count(x)) for x in filter(lambda rec : target.count(rec)>1,target)))
      
          {3: 3, 4: 4} #it saying 3 is repeated 3 times and 4 is 4 times
      
          duplicates=filter(lambda rec : target.count(rec)>1,target)
      
          [3, 4, 4, 4, 3, 4, 3]
      
      list(set([val for idx, val in enumerate(input_list) if val in input_list[idx+1:]]))
      
      def dupes(ilist):
          temp_list = [] # initially, empty temporary list
          dupe_list = [] # initially, empty duplicate list
          for each in ilist:
              if each in temp_list: # Found a Duplicate element
                  if not each in dupe_list: # Avoid duplicate elements in dupe_list
                      dupe_list.append(each) # Add duplicate element to dupe_list
              else: 
                  temp_list.append(each) # Add a new (non-duplicate) to temp_list
      
          return dupe_list
      
      raw_list = [1,2,3,3,4,5,6,6,7,2,3,4,2,3,4,1,3,4,]
      
      clean_list = list(set(raw_list))
      duplicated_items = []
      
      for item in raw_list:
          try:
              clean_list.remove(item)
          except ValueError:
              duplicated_items.append(item)
      
      
      print(duplicated_items)
      # [3, 6, 2, 3, 4, 2, 3, 4, 1, 3, 4]
      
      arr=[]
      dup =[]
      for i in range(int(input("Enter range of list: "))):
          arr.append(int(input("Enter Element in a list: ")))
      for i in arr:
          if arr.count(i)>1 and i not in dup:
              dup.append(i)
      print(dup)
      
      from collections import Counter
      
      def duplicates(values):
          dups = Counter(values) - Counter(set(values))
          return list(dups.keys())
      
      print(duplicates([1,2,3,6,5,2]))
      
      l = [1,2,3,2,1,5,6,5,5,5]
      
      res = [(x, count) for x, g in groupby(sorted(l)) if (count := len(list(g))) > 1]
      
      print(res)
      
      [(1, 2), (2, 2), (5, 4)]
      
      a = sorted(a)
      dupes = list(set(a[::2]) & set(a[1::2]))