Python:删除集合中没有负计数器部分的数字

Python:删除集合中没有负计数器部分的数字,python,syntax,numbers,set,Python,Syntax,Numbers,Set,我已经找到了获取列表并返回每个元素只出现一次的列表的代码。但是我不知道我需要做什么才能消除没有负计数器部分的数字: 例如,如果一个列表有数字[1,-1,2,-2,3]。当列表返回时,它将删除3 到目前为止我有 def one(a): conversion = set() conversion_add = conversion.add elim = [x for x in a if x not in conversion and not conversion_add(x)] 接下来我

我已经找到了获取列表并返回每个元素只出现一次的列表的代码。但是我不知道我需要做什么才能消除没有负计数器部分的数字:

例如,如果一个列表有数字[1,-1,2,-2,3]。当列表返回时,它将删除3

到目前为止我有

def one(a):
  conversion = set()
  conversion_add = conversion.add
  elim = [x for x in a if x not in conversion and not conversion_add(x)]
接下来我需要做什么?If语句,我需要使用什么语法来比较正数和负数,以便在不使用负数的情况下删除多余的数字

非常感谢

听起来不错:

src = set([1,-1,2,-2,3])
no_match = set(a for a in src if -a not in src)
match = set(a for a in src if -a in src)
结果:

>>> src = set([1,-1,2,-2,3])
>>> no_match = set(a for a in src if -a not in src)
>>> match = set(a for a in src if -a in src)
>>> no_match
set([3])
>>> match
set([1, 2, -1, -2])
听起来不错:

src = set([1,-1,2,-2,3])
no_match = set(a for a in src if -a not in src)
match = set(a for a in src if -a in src)
结果:

>>> src = set([1,-1,2,-2,3])
>>> no_match = set(a for a in src if -a not in src)
>>> match = set(a for a in src if -a in src)
>>> no_match
set([3])
>>> match
set([1, 2, -1, -2])

您可以使用
过滤器
,然后将结果列表转换为集合:

> x = [1, 2, 3, -2, -4, -1, 4]
> print filter(lambda elem: -elem in x, x)
[1, 2, -2, -4, -1, 4]

您可以使用
过滤器
,然后将结果列表转换为集合:

> x = [1, 2, 3, -2, -4, -1, 4]
> print filter(lambda elem: -elem in x, x)
[1, 2, -2, -4, -1, 4]

这比将所有内容添加到集合中,然后根据集合检查成员身份要慢得多。但是,如果您不需要关心大型列表的性能,这仍然是非常好的。对于非常小的列表,它甚至可能更快。这比将所有内容添加到集合中,然后根据集合检查成员身份要慢得多。但如果您不需要关心大型列表的性能,则仍然可以。对于非常小的列表,它甚至可能更快。我有一个想法,但可能不适合在Python中实现:在列表中添加一个零,然后对其进行排序。找到零,然后用零的索引初始化两个索引指针。每次将指针左右移动一个条目,并消除较小的不匹配项。如果这样做有效,它将花费O(nlogn)time。要获得
match
,您可以执行
match=src.difference(no_match)
。这将节省一点时间,而且可能更清晰,因为根据定义,
match
no_match
的组合必须等于
src
,并且
no_match
match
是相互排斥的。@Mai,我想你的意思是:你不需要加零。只需从两端开始,在左右索引交叉时终止。@Mai-由于Python
set
基于哈希表,并且已摊销O(1)个插入,因此
set
版本应为O(n)。因此,在渐近意义上,任何需要你对项目进行排序的东西都会比这个答案慢,除非你能在O(n)时间内排序。如果您的数据肯定是某个有界范围内的整数,您可以在O(n)时间内对它们进行排序,但Python
sort
无法做到这一点-您需要基数排序,而且您仍然只能获得与哈希表/集合方法渐近相等的性能。好主意,但是。@Mai-实际上,可能的限制条件-对于大整数,计算散列可能是O(logm),其中m是整数。很多O(n)算法都依赖于有界范围内的值,或者实际上有O(n log m)-这就是填充哈希表的情况。基数排序也是如此——如果不绑定整数,性能将是O(n log m),其中n是整数的数量,m是整数的大小。原因-整数值
m
log m
个数字。我有一个想法,但可能不适合在Python中实现:在列表中添加一个零,然后对其排序。找到零,然后用零的索引初始化两个索引指针。每次将指针左右移动一个条目,并消除较小的不匹配项。如果这样做有效,它将花费O(nlogn)time。要获得
match
,您可以执行
match=src.difference(no_match)
。这将节省一点时间,而且可能更清晰,因为根据定义,
match
no_match
的组合必须等于
src
,并且
no_match
match
是相互排斥的。@Mai,我想你的意思是:你不需要加零。只需从两端开始,在左右索引交叉时终止。@Mai-由于Python
set
基于哈希表,并且已摊销O(1)个插入,因此
set
版本应为O(n)。因此,在渐近意义上,任何需要你对项目进行排序的东西都会比这个答案慢,除非你能在O(n)时间内排序。如果您的数据肯定是某个有界范围内的整数,您可以在O(n)时间内对它们进行排序,但Python
sort
无法做到这一点-您需要基数排序,而且您仍然只能获得与哈希表/集合方法渐近相等的性能。好主意,但是。@Mai-实际上,可能的限制条件-对于大整数,计算散列可能是O(logm),其中m是整数。很多O(n)算法都依赖于有界范围内的值,或者实际上有O(n log m)-这就是填充哈希表的情况。基数排序也是如此——如果不绑定整数,性能将是O(n log m),其中n是整数的数量,m是整数的大小。原因-整数值
m
log m
位。