如何“否定”(?)列表 - Python

时间:2012-10-15 01:36:37

标签: python

  

可能重复:
  python takes list and returns only if negative value also exists using set

我遇到另一个家庭作业问题。

  

通过使用一个集合,写一个取消的方法(a),取一个列表,a,作为   参数并返回一个仅包含元素x的列表   -x也在

他的例子表明输入是

  

[ - 6,8,3,3,2,-9,1,-3,2,4,4,-8,7,8,2,-2,-7,0,1, - 9,   -3,-7,-3,-5,6,-3,6,-3,-10,-8]

,输出

  

[ - 6,8,7,3,2,-3,2,4,4,-8,7,8,2,-2,-7,0,-3,-7,-3 ,6,   -3,6,-3,-8]

我能够在不使用带

的集合的情况下弄清楚如何做到这一点
return [x for x in a if -x in a]

我在实现问题集时遇到问题。 有人可以给我采取的步骤,我应该如何解决这个问题......我不是在寻找完整的工作,但是看看你是如何做的也很好。

2 个答案:

答案 0 :(得分:2)

您的代码适用于一组。您需要做的就是将列表更改为一组。

def negate(a) :
  return [x for x in a if -x in a]

a = set()
a.add(1)
a.add(2)
a.add(-1)
print negate(a)

Demo

答案 1 :(得分:1)

以下是您需要实施的算法:

  1. 遍历列表中的所有元素
  2. 当您考虑每个单独的元素时,请检查列表中是否存在否定
  3. 如果列表中存在否定,请保留
  4. 如果列表中不存在否定,请不要保留。
  5. 在您对列表中的元素进行迭代时,从列表中删除元素通常是一个坏主意,因此最好创建一个新的空列表并继续添加(或不添加)它

    def filterNegs(L):
        answer = []
        for i in L:
            if -1*i in L:
                answer.append(i)
        return answer
    

    以下是对列表的理解:

    return [i for i in a if -1*i in a]
    

    但是当你这样做时会出现性能问题。检查元素是否在列表中是O(n)操作和集合中的O(1)。因此,最好先将L转换为一组:

    def filterNegs(L):
        L = set(L)
        answer = []
        for i in L:
            if -1*i in L:
                answer.append(i)
        return answer
    

    以下是对列表的理解:

    L = set(L)
    return [i for i in a if -1*i in a]
    

    希望这有帮助