查找并删除数组中的最小公共元素(Python)

时间:2015-01-23 05:09:33

标签: python arrays count

我试图在整数数组中找到最不常见的元素并将其删除,并以相同的顺序返回列表。

这就是我所做的,但当列表为[1, 2, 3, 4, 5]时,我的函数应返回[],但会返回[2, 4]

def check(data):
    for i in data:
        if data.count(i) <= 1:
            data.remove(i)
    return data


data = [1, 2, 3, 4, 5]
print check(data) 

4 个答案:

答案 0 :(得分:3)

从正在迭代的列表中删除项目会导致您跳过项目(即删除每个项目后面的下一项目)。

相反,请创建一个仅包含您要保留的值的新列表。

from collections import Counter

def check(data):
    ctr = Counter(data)
    least = min(ctr.values())
    return [d for d in data if ctr[d] > least]

答案 1 :(得分:1)

在迭代它时,不应该修改(特别是删除)列表中的元素。

发生的事情是:

  1. 最初迭代器位于第1个元素,即i = 1
  2. 由于d.count(1)为1,因此您从列表中删除1。
  3. 列表现在是[2,3,4,5],但迭代器前进到第二个元素,现在是3。
  4. 由于d.count(3)为1,因此您将其删除为列表[2,4,5]
  5. 迭代器前进到第3个元素,现在是5。
  6. 再次删除5列表[2,4]。
  7. 您的算法应该:

    1. 获取所有元素的计数
    2. 找出最小的数量。
    3. 查找计数最少的元素。
    4. 从列表中删除步骤3中找到的元素。

答案 2 :(得分:0)

您不应该检查data.count(i) <= 1。在这种情况下会发生什么:[1, 1, 2, 2, 3, 3, 3]12是最不常见的元素,但您永远不会删除它们。同样,在for循环中改变列表也是一个坏主意。

您可以做的一件事是使用Counter class

  1. most_common()方法的尾部取一个适当的片段(当你沿着列表向下时,它们的条目得到 less 频繁,所以这就是为什么你采取尾巴而不是头)。
  2. 然后,您可以重复搜索列表中的这些事件并将其删除,直到它们没有出现。

答案 3 :(得分:0)

另一个尝试:

def check(data):
    ctr = Counter(data)
    keys = ctr.keys()
    vals = ctr.values()
    least = []
    m = min(vals)
    for i in range(0,len(vals)):
        if vals[i] == m:
            least.append(keys[i])
    print least

data = [1, 2, 3, 4, 5,1]
result = check(data)