如何在python中识别从set()中删除的元素?

如何在python中识别从set()中删除的元素?,python,python-2.7,csv,python-3.x,set,Python,Python 2.7,Csv,Python 3.x,Set,我尝试使用python的set()方法来查找列表中唯一的元素。删除所有重复项效果很好。但这是我的要求,我想通过使用set()方法获取要删除的元素。谁能帮我一下吗 a=[1,2,3,1,4] b=set(a) Output:[1,2,3,4] 我的预期输出是[1]。从set()方法中删除的元素在这里很有用 from collections import Counter counts = Counter(a) b = set(counts.keys()) for x, count in count

我尝试使用python的
set()
方法来查找列表中唯一的元素。删除所有重复项效果很好。但这是我的要求,我想通过使用
set()
方法获取要删除的元素。谁能帮我一下吗

a=[1,2,3,1,4]
b=set(a)
Output:[1,2,3,4]
我的预期输出是
[1]
。从
set()
方法中删除的元素在这里很有用

from collections import Counter
counts = Counter(a)
b = set(counts.keys())
for x, count in counts.items():
    if count > 1:
        print('%d appearances of %s were removed in the set' % (count-1, x))

你甚至不需要套装。您希望每个元素有一个以上的出现次数。集合中的计数器和字典理解应该能让你达到目的

from collections import Counter

a = [1, 1, 1, 2, 2, 3, 4]    
removed = {k: v-1 for k, v in Counter(a).iteritems() if v > 1}

>>> removed
Out[8]: {1: 2, 2: 1}
您可以扩展Set类(拥有自己的Set类,比如MySet)并重写此函数

def _update(self, iterable):
    # The main loop for update() and the subclass __init__() methods.
    data = self._data

    # Use the fast update() method when a dictionary is available.
    if isinstance(iterable, BaseSet):
        data.update(iterable._data)
        return

    value = True

    if type(iterable) in (list, tuple, xrange):
        # Optimized: we know that __iter__() and next() can't
        # raise TypeError, so we can move 'try:' out of the loop.
        it = iter(iterable)
        while True:
            try:
                for element in it:
                    data[element] = value
                return
            except TypeError:
                transform = getattr(element, "__as_immutable__", None)
                if transform is None:
                    raise # re-raise the TypeError exception we caught
                data[transform()] = value
    else:
        # Safe: only catch TypeError where intended
        for element in iterable:
            try:
                data[element] = value
            except TypeError:
                transform = getattr(element, "__as_immutable__", None)
                if transform is None:
                    raise # re-raise the TypeError exception we caught
                data[transform()] = value

这将返回仅包含从原始集合中删除的项目的集合:

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

>>> set(i for i in a if a.count(i) > 1)

>>> {1}

我认为你处理这个问题的方式有点混淆。与其试图让一个
set()
去做它不打算做的事情(返回一个重复列表),我会使用一个
collections.Counter()
来收集重复项,然后从中获取集合

下面是一些代码:

#!python
from collections import Counter
c = Counter([1,2,3,1,4])
dupes = [k for k,v in c.items() if v>1]
b = set(c.keys())

使用
计数器尝试此操作

from collections import Counter
a = [1, 2, 3, 1, 4]
>>>[i for i in Counter(a) if Counter(a)[i] > 1]
[1]
简单的python示例

def finder(s):
    seen,yields=set(),set()
    for i in s:
      if i in seen and i not in yields:
          yield i
          yields.add(i)
      else:
          seen.add(i)
    print(type(seen), seen )
    
a = [1,2,3,1,4] 
print(list(finder(a)))

生产,

<class 'set'> {1, 2, 3, 4}
[1]

[Program finished] 
{1,2,3,4}
[1]
[程序完成]

如果输入是
[1,2,3,1,4,1,1]
?获取他们的计数并检查计数>1的项目。是的,因为这就是问题所在。对于那些使用计数器的人,我相信你给出了一个替代方案,而不是回答他们的问题(使用额外的循环等)。谢谢你的否决票(顺便说一句:)