我在解决下一个问题时面临一些问题:
我们有一个元素列表(整数),我们应该返回一个列表,该列表仅包含此列表中的非唯一元素。不改变列表的顺序 我认为最好的方法是删除或删除所有唯一元素。
请注意,我刚开始学习python,并且只想要最简单的解决方案。
这是我的代码:
def checkio(data):
for i in data:
if data.count(i) == 1: #if element seen in the list just ones, we delet this el
ind = data.index(i)
del data[ind]
return data
答案 0 :(得分:3)
您可以实施OrderedCounter
,例如:
from collections import OrderedDict, Counter
class OrderedCounter(Counter, OrderedDict):
pass
data = [1, 3, 1, 2, 3, 5, 8, 1, 5, 2]
duplicates = [k for k, v in OrderedCounter(data).items() if v > 1]
# [1, 3, 2, 5]
因此,您计算每个值的出现次数,然后筛选它是否具有多于一个的频率。继承自OrderedDict
意味着保留原始元素的顺序。
通过评论,您希望保留所有重复元素,因此您可以预先构建一组重复条目,然后重新迭代原始列表,例如:
from collections import Counter
data = [1, 3, 1, 2, 3, 5, 8, 1, 5, 2]
duplicates = {k for k, v in Counter(data).items() if v > 1}
result = [el for el in data if el in duplicates]
# [1, 3, 1, 2, 3, 5, 1, 5, 2]
答案 1 :(得分:3)
您可以通过反向遍历列表来使您的功能正常工作:
def checkio(data):
for index in range(len(data) - 1, -1, -1):
if data.count(data[index]) == 1:
del data[index]
return data
print(checkio([3, 3, 5, 8, 1, 4, 5, 2, 4, 4, 3, 0]))
[3, 3, 5, 4, 5, 4, 4, 3]
print(checkio([1, 2, 3, 4]))
[]
这样可行,因为它只删除已经迭代过的列表部分中的数字。
答案 2 :(得分:2)
试试这个:
>>> a=[1,2,3,3,4,5,6,6,7,8,9,2,0,0]
>>> a=[i for i in a if a.count(i)>1]
>>> a
[2, 3, 3, 6, 6, 2, 0, 0]
>>> a=[1, 2, 3, 1, 3]
>>> a=[i for i in a if a.count(i)>1]
>>> a
[1, 3, 1, 3]
>>> a=[1, 2, 3, 4, 5]
>>> a=[i for i in a if a.count(i)>1]
a
[]
答案 3 :(得分:2)
我刚使用了列表理解。
def checkio(data):
a=[i for i in data if data.count(i)>1]
return a
print checkio([1,1,2,2,1,1,1,3,4,5,6,7,8])
答案 4 :(得分:2)
def checkio(data):
lis = []
for i in data:
if data.count(i)>1:
lis.append(i)
print(lis)
checkio([1,2,3,3,2,1])
是的,为这个帖子做贡献有点晚了,但只是想把它放在网上供其他人使用。
答案 5 :(得分:1)
按照你的开始,迭代整数列表,但不计算或删除元素,尝试只测试元素是否已被看到,将其附加到重复元素列表:
def checkio(data):
elements = []
duplicates = []
for i in data:
if i not in elements:
elements.append(i)
else:
if i not in duplicates:
duplicates.append(i)
return duplicates
d = [1, 3, 1, 2, 3, 5, 8, 1, 5, 2]
print (checkio(d))
#[1, 3, 5, 2]
答案 6 :(得分:0)
numbers = [1, 1, 1, 1, 3, 4, 9, 0, 1, 1, 1]
x=set(numbers)
print(x)
您也可以使用 set 关键字来获得所需的解决方案。
答案 7 :(得分:0)
每次使用while循环修改列表时,我都会使用整数和布尔值进行检查。
rechecks = 1
runscan = True
while runscan == True:
for i in data:
if data.count(i) <2:
data.remove(i)
rechecks+=1
#need to double check now
if rechecks >0:
runscan = True
rechecks-=1
else:
runscan = False
return data
答案 8 :(得分:0)
生成新列表会更容易吗?
def unique_list(lst):
new_list = []
for value in lst:
if value not in new_list:
new_list.append(value)
return new_list
lst = [1,2,3,1,4,5,1,6,2,3,7,8,9]
print(unique_list(lst))
打印[1,2,3,4,5,6,7,8,9]