列表中的整数

时间:2013-10-10 20:24:28

标签: python list set

我需要得到相同的整数:例如,如果列表由[0,1,-1,3]组成,它将返回1 -1,从列表中得到正数和负数。到目前为止,我有。

s = []
for i in a:
    if i in s
        s.append(i and -i)
print s

4 个答案:

答案 0 :(得分:4)

让我们直接将它从英语翻译成Python。

首先,我们必须准确地说出英文说明​​:您想要a中的所有值,其否定也在a

在Python中,那是:

[value for value in a if -value in a]

但是,如果你有一百万个值,那么-value in a将需要平均搜索每个值的五十万个值,这意味着总计将进行五万亿次比较。你的一个同学显然已经把它转过来了,并且在一些示例数据上花费了一分钟就应该花了一秒钟。

您可以使用set来解决此问题。在集合中查找值只需要进行单个哈希查找和单个比较​​,而不必与每个值进行比较。所以:

s = set(a)
[value for value in a if -value in s]

有各种方法可以进一步优化事物。最明显的是,如果您不需要保留重复项或按顺序返回值,则可以迭代该集而不是原始列表。但还有其他聪明的想法。你可以看到一堆here,以及一些比较。

答案 1 :(得分:3)

要只获得具有正面和负面计数器部分的数字对,您可以使用这样的列表理解:

>>> a = [0, 1, -1, 3]
>>> 
>>> [val for val in a if -val in a]
[0, 1, -1]

请注意,您也会按预期获得0。如果您不想这样做,请为此添加一个明确的检查。

答案 2 :(得分:2)

循环解决方案:

s = []
for i in a:
    if -i in a:
        s.append(i)

print s

过滤解决方案:

s = filter(lambda x: -x in s, s)

列表理解解决方案:

[x for x in s if -x in s]

仔细查看您的解决方案。如果您尝试同时追加-i和i,则会添加重复值。另外,正如@kindall所提到的,你应该在两个for循环中使用list a。

这是解决方案的性能基准:

这是解决方案的性能基准:

performance

我必须说for循环让我感到惊讶......

PS:答案是针对python 2.7的。在python 3中,map,filter等等,你必须使用list(filter(lambda x:-x in s,s))来评估它们。

答案 3 :(得分:-2)

我还没有看到如何实现索引,但很可能这是一个O(n ^ 2)解决方案。

#!/usr/bin/env python

l = [ 1, 2 , -1 , 3]

for i in l:
    try:
        k = l.index(-1 * i )
        print i
    except ValueError as e:
        pass

更好的方法如下:

  1. 对列表进行排序:nlogn
  2. 然后,对于列表中的每个元素,执行二进制搜索当前元素的否定。您可以为此运行for循环。如果你得到一个打印元素。这也是nlogn。
  3. 因此,您将在nlogn时间内完成所需的工作。