Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用itertools.compositions生成对时出现Python内存错误_Python_List_Compiler Errors_Out Of Memory - Fatal编程技术网

使用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-可能有数百个。这些组合可能会达到数千个。这个解决方案非常聪明。它实际上一点也不难,但它是一个非常有用的技巧,可以帮助你很多次。所以,如果你不明白为什么会这样,那就值得一试。我的回答试图有效地解释同样的把戏,但是一步一步。谢谢你的建议。我没有考虑到我可能会产生太多超出内存处理能力的数据。我发现有一种不同的方法可以得到相同的结果。