我需要得到相同的整数:例如,如果列表由[0,1,-1,3]组成,它将返回1 -1,从列表中得到正数和负数。到目前为止,我有。
s = []
for i in a:
if i in s
s.append(i and -i)
print s
答案 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。
这是解决方案的性能基准:
这是解决方案的性能基准:
我必须说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
更好的方法如下:
因此,您将在nlogn时间内完成所需的工作。