Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.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_Python 2.7 - Fatal编程技术网

Python 在列表中查找非唯一元素无效

Python 在列表中查找非唯一元素无效,python,python-2.7,Python,Python 2.7,我想在列表中找到非唯一的元素,但我无法理解为什么在下面的代码部分中没有出现这种情况 >>> d = [1, 2, 1, 2, 4, 4, 5, 'a', 'b', 'a', 'b', 'c', 6,'f',3] >>> for i in d: ... if d.count(i) == 1: ... d.remove(i) ... >>> d [1, 2, 1, 2, 4, 4, 'a', 'b', 'a',

我想在列表中找到非唯一的元素,但我无法理解为什么在下面的代码部分中没有出现这种情况

>>> d = [1, 2, 1, 2, 4, 4, 5, 'a', 'b', 'a', 'b', 'c', 6,'f',3]
>>> for i in d:
...     if d.count(i) == 1:
...             d.remove(i)
... 
>>> d
[1, 2, 1, 2, 4, 4, 'a', 'b', 'a', 'b', 6, 3]
6号和3号应该被移除。 如果我使用

d = [1, 2, 1, 2, 4, 4, 5, 'a', 'b', 'a', 'b', 'c']
我得到了正确的答案。请解释发生了什么,我很困惑


我使用的是Python2.7.5。

在遍历列表时删除列表元素从来都不是一个好主意。实现这一点的适当方法是使用带有:

如果要按重复元素在列表中的显示顺序保留重复元素,请执行以下操作:

>>> keep = {k for (k,v) in Counter(d).iteritems() if v > 1}
>>> [x for x in d if x in keep]
[1, 2, 1, 2, 4, 4, 'a', 'b', 'a', 'b']

我会尽力解释为什么你的方法行不通。要理解为什么某些元素没有按应有的方式删除,请想象一下,我们希望在循环时从列表中删除所有
b
s
[a,b,b,c]
。它看起来像这样:

+-----------------------+ | a | b | b | c | +-----------------------+ ^ (first iteration) +-----------------------+ | a | b | b | c | +-----------------------+ ^ (next iteration: we found a 'b' -- remove it) +-----------------------+ | a | | b | c | +-----------------------+ ^ (removed b) +-----------------+ | a | b | c | +-----------------+ ^ (shift subsequent elements down to fill vacancy) +-----------------+ | a | b | c | +-----------------+ ^ (next iteration) +-----------------------+ |a | b | b | c| +-----------------------+ ^(第一次迭代) +-----------------------+ |a | b | b | c| +-----------------------+ ^(下一次迭代:我们发现了一个“b”——将其删除) +-----------------------+ |a | | b | c| +-----------------------+ ^(b)删除 +-----------------+ |a | b | c| +-----------------+ ^(向下移动后续元素以填补空缺) +-----------------+ |a | b | c| +-----------------+ ^(下一次迭代) 请注意,我们跳过了第二个
b
!一旦我们删除了第一个
b
,元素被下移,因此我们的
for
-循环无法触及列表中的每个元素。代码中也会发生同样的情况。

更好地使用:

另见相关线程:


我只是想,如果有人感兴趣,我会将我的方法添加到集合理解中

>>> d = [1, 2, 1, 2, 4, 4, 5, 'a', 'b', 'a', 'b', 'c', 6,'f',3]
>>> d = list({x for x in d if d.count(x) > 1})
>>> print d
['a', 1, 2, 'b', 4]

我相信Python2.7及更高版本具有集理解功能。

感谢所有的回答和评论

我想了一会儿,然后以我以前的方式得到了另一个答案,我已经编写了代码。所以,我把它贴出来了

d = [1, 2, 1, 2, 4, 4, 5, 'a', 'b', 'a', 'b', 'c', 6,'f',3]
e = d[:] # just a bit of trick/spice
>>> for i in d:
...     if d.count(i) == 1:
...             e.remove(i)
... 
>>> e
[1, 2, 1, 2, 4, 4, 'a', 'b', 'a', 'b']

@阿尔沙吉,你的解释让我玩了这个把戏。谢谢

您也可以这样做:

data=[1,2,3,4,1,2,3,1,2,1,5,6]
    first_list=[]
    second_list=[]
    for i in data:
        if data.count(i)==1:
            first_list.append(i)
        else:
            second_list.append(i)
            print (second_list)
结果 [1,2,3,1,2,3,1,2,1]

>>> d = [1, 2, 1, 2, 4, 4, 5, 'a', 'b', 'a', 'b', 'c', 6,'f',3]
使用到集合的转换生成唯一项:

>>> d_unique = list(set(d))
使用列表可以找到非唯一项

>>> [item for item in d_unique if d.count(item) >1]
[1, 2, 4, 'a', 'b']

谢谢使用计数器它是工作的,但为什么这段代码不工作。我想知道里面有什么问题@阿尔沙吉:很好的解释!顺便说一下,我希望答案是[1,2,1,2,4,4,5,'a','b','a','b'],而不是[a',1,2,'b',4]。如果我在你的代码中使用计数器中的elements()方法来得到这个答案,将会使列表排序,这是我不想要的@Tan可能会看到编辑(顺便问一下,5是一个输入错误吗?为什么5应该在该列表中?)。使用Python 3.5.3,建议的解决方案会返回一个错误:
AttributeError:“Counter”对象没有属性“iteritems”
。我使用的不是
iterms()
而是
items()
,这对我来说很好。请不要使用这种方法,它有
O(n^2)
复杂性
>>> d_unique = list(set(d))
>>> [item for item in d_unique if d.count(item) >1]
[1, 2, 4, 'a', 'b']