使用itertools.compositions生成对时出现Python内存错误
我有一个未指定数字的整数列表。我想找出列表中匹配某个值的两个整数之间的差异使用itertools.compositions生成对时出现Python内存错误,python,list,compiler-errors,out-of-memory,Python,List,Compiler Errors,Out Of Memory,我有一个未指定数字的整数列表。我想找出列表中匹配某个值的两个整数之间的差异 from itertools import combinations #Example of a list intList = [3, 6, 2, 7, 1] diffList = [abs(a -b) for a, b in combinations(intList, 2)] #Given if difference = 2 print diffList.count(2) 代码片段起作用了,但是当给出一个
from itertools import combinations
#Example of a list
intList = [3, 6, 2, 7, 1]
diffList = [abs(a -b) for a, b in combinations(intList, 2)]
#Given if difference = 2
print diffList.count(2)
代码片段起作用了,但是当给出一个更大的列表时,我得到了MemoryError。有人能告诉我这些代码是否有问题,或者错误是由于我的硬件限制造成的吗?确切地说,“较大的列表”有多大?如果len(intList)
是n
,len(diffList)
将是n*(n-1)//2
(一次执行的n
事物的组合数为2)。如果n
足够大,这将消耗所有内存
如果您只关心值2
print sum(abs(a-b) == 2 for a, b in combinations(intList, 2))
无论
intList
有多大,都是一种消耗很少内存的方法。但是,与len(intList)
的平方成比例的时间仍然需要您可以使用以下代码解决问题:
result = 0
for a, b in combinations(intList, 2):
if abs(a - b) == 2:
result += 1
print result
因此,您的问题不仅在于硬件限制,还在于硬件限制和错误代码。您创建了一个具有列表理解功能的列表,然后调用了它的
count
方法。相反,只需使用生成器表达式创建一个迭代器,然后调用一个采用任何iterable的icount
函数:
diffs = (abs(a -b) for a, b in combinations(intList, 2))
print icount(diffs, 2)
它与原始代码几乎相同,但不使用任何额外内存
当然,
icount
函数不存在,但您应该能够自己编写它
def icount(iterable, value):
result = 0
for element in iterable:
if element == value:
result += 1
return result
……或者
def ilen(iterable):
return sum(1 for _ in iterable)
def icount(iterable, value):
filtered = (elem for elem in iterable if elem == value)
return ilen(filtered)
def icount(iterable, value):
return sum(elem == value for elem in iterable)
……或者
def ilen(iterable):
return sum(1 for _ in iterable)
def icount(iterable, value):
filtered = (elem for elem in iterable if elem == value)
return ilen(filtered)
def icount(iterable, value):
return sum(elem == value for elem in iterable)
…或(使用)
如果您愿意,您可以将表达式合并到
icount
函数中,并在一行中完成所有操作,然后您就得到了Tim Peters的确切答案。列表可能有多长?@MostafaR-可能有数百个。这些组合可能会达到数千个。这个解决方案非常聪明。它实际上一点也不难,但它是一个非常有用的技巧,可以帮助你很多次。所以,如果你不明白为什么会这样,那就值得一试。我的回答试图有效地解释同样的把戏,但是一步一步。谢谢你的建议。我没有考虑到我可能会产生太多超出内存处理能力的数据。我发现有一种不同的方法可以得到相同的结果。