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']