有没有更好的方法来计算多个列表的乘积?
Any better way to calculate product of multiple lists?
我需要根据 n 个输入列表获取所有可能的组合,并对它们做一些处理。
当前代码示例:
import itertools
# example inputs
list_small = [1, 2, 3]
list_medium = [444, 666, 242]
list_huge = [1680, 7559, 5573, 43658, 530, 11772, 284, 50078, 783, 37809, 6740, 37765, 74492, 50078, 783, 37809, 6740, 37765, 74492]
# out of the input list, I need to generate all numbers from 0 to the current list element
# e.g. if I have 6, I need to get [0, 1, 2, 3, 4, 5, 6]
# if I get a list [1, 2, 3], the output will be [[0, 1], [0, 1, 2], [0, 1, 2, 3]]
# I achieved this by doing it with xrange: [x for x in xrange(0, current_list_element + 1)]
# after that, I need to generate all possible combinations using the generated lists
# I managed to do this by using itertools.product()
# print this to get all possible combinations
# print list(itertools.product(*[[x for x in xrange(0, current_list_element + 1)] for current_list_element in list_medium]))
cumulative_sum = 0
for current_combination in itertools.product(*[[x for x in xrange(0, current_list_element + 1)] for current_list_element in list_medium]):
# now I need to do some calculations to the current combination
# e.g. get sum of all combinations, this is just an example
cumulative_sum += sum(current_combination)
# another example
# get XOR sum of current combination, more at https://en.wikipedia.org/wiki/Exclusive_or
print reduce(operator.xor, current_combination, 0)
# runs fast for list_small, then takes some time for list_medium and then takes ages for list_huge
print cumulative_sum
这适用于较小的列表,但对于较大的列表需要无穷大/或抛出运行时错误。有没有更好的方法来做到这一点?获得所有组合的更好方法?还是我以某种错误的方式使用了 xrange?
我用 Python 2.7 和 Pypy 2 试过了。
编辑:
感谢@famagusta 我摆脱了 xrange,但问题仍然存在
import itertools
# example inputs
list_small = [1, 2, 3]
list_medium = [444, 666, 242]
list_huge = [1680, 7559, 5573, 43658, 530, 11772, 284, 50078, 783, 37809, 6740, 37765, 74492, 50078, 783, 37809, 6740, 37765, 74492]
max_element = max(get_input_stones)
combo_list = range(0, max_element + 1)
cumulative_sum = 0
for current_combination in itertools.product(*combo_list):
# now I need to do some calculations to the current combination
# e.g. get sum of all combinations, this is just an example
cumulative_sum += sum(current_combination)
# another example
# get XOR sum of current combination, more at https://en.wikipedia.org/wiki/Exclusive_or
print reduce(operator.xor, current_combination, 0)
# runs fast for list_small, then takes some time for list_medium and then takes ages for list_huge
print cumulative_sum
生成此类嵌套列表可能会让您遇到内存限制问题。您可以只使用一个从列表中最大数生成的超级列表,而不是重复生成子列表。只需将索引存储在较小元素停止的位置。
例如,[1, 6, 10] - [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [1, 6, 10]
第二个列表告诉您在第一个列表的什么地方停止以提取感兴趣的子列表进行计算
这应该可以为您节省一些 space。
list_small = [1, 2, 3]
list_medium = [444, 666, 242]
list_huge = [1680, 7559, 5573, 43658, 530, 11772, 284, 50078, 783, 37809, 6740, 37765, 74492, 50078, 783, 37809, 6740, 37765, 74492]
max_element = max(list_huge) # being lazy here - write a max function
combo_list = range(0, max_element + 1) # xrange does not support slicing
cumulative_sum = 0
for element in list_huge:
cumulative_sum += sum(combo_list[:element])
print(cumulative_sum)
我需要根据 n 个输入列表获取所有可能的组合,并对它们做一些处理。
当前代码示例:
import itertools
# example inputs
list_small = [1, 2, 3]
list_medium = [444, 666, 242]
list_huge = [1680, 7559, 5573, 43658, 530, 11772, 284, 50078, 783, 37809, 6740, 37765, 74492, 50078, 783, 37809, 6740, 37765, 74492]
# out of the input list, I need to generate all numbers from 0 to the current list element
# e.g. if I have 6, I need to get [0, 1, 2, 3, 4, 5, 6]
# if I get a list [1, 2, 3], the output will be [[0, 1], [0, 1, 2], [0, 1, 2, 3]]
# I achieved this by doing it with xrange: [x for x in xrange(0, current_list_element + 1)]
# after that, I need to generate all possible combinations using the generated lists
# I managed to do this by using itertools.product()
# print this to get all possible combinations
# print list(itertools.product(*[[x for x in xrange(0, current_list_element + 1)] for current_list_element in list_medium]))
cumulative_sum = 0
for current_combination in itertools.product(*[[x for x in xrange(0, current_list_element + 1)] for current_list_element in list_medium]):
# now I need to do some calculations to the current combination
# e.g. get sum of all combinations, this is just an example
cumulative_sum += sum(current_combination)
# another example
# get XOR sum of current combination, more at https://en.wikipedia.org/wiki/Exclusive_or
print reduce(operator.xor, current_combination, 0)
# runs fast for list_small, then takes some time for list_medium and then takes ages for list_huge
print cumulative_sum
这适用于较小的列表,但对于较大的列表需要无穷大/或抛出运行时错误。有没有更好的方法来做到这一点?获得所有组合的更好方法?还是我以某种错误的方式使用了 xrange?
我用 Python 2.7 和 Pypy 2 试过了。
编辑: 感谢@famagusta 我摆脱了 xrange,但问题仍然存在
import itertools
# example inputs
list_small = [1, 2, 3]
list_medium = [444, 666, 242]
list_huge = [1680, 7559, 5573, 43658, 530, 11772, 284, 50078, 783, 37809, 6740, 37765, 74492, 50078, 783, 37809, 6740, 37765, 74492]
max_element = max(get_input_stones)
combo_list = range(0, max_element + 1)
cumulative_sum = 0
for current_combination in itertools.product(*combo_list):
# now I need to do some calculations to the current combination
# e.g. get sum of all combinations, this is just an example
cumulative_sum += sum(current_combination)
# another example
# get XOR sum of current combination, more at https://en.wikipedia.org/wiki/Exclusive_or
print reduce(operator.xor, current_combination, 0)
# runs fast for list_small, then takes some time for list_medium and then takes ages for list_huge
print cumulative_sum
生成此类嵌套列表可能会让您遇到内存限制问题。您可以只使用一个从列表中最大数生成的超级列表,而不是重复生成子列表。只需将索引存储在较小元素停止的位置。
例如,[1, 6, 10] - [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [1, 6, 10]
第二个列表告诉您在第一个列表的什么地方停止以提取感兴趣的子列表进行计算
这应该可以为您节省一些 space。
list_small = [1, 2, 3]
list_medium = [444, 666, 242]
list_huge = [1680, 7559, 5573, 43658, 530, 11772, 284, 50078, 783, 37809, 6740, 37765, 74492, 50078, 783, 37809, 6740, 37765, 74492]
max_element = max(list_huge) # being lazy here - write a max function
combo_list = range(0, max_element + 1) # xrange does not support slicing
cumulative_sum = 0
for element in list_huge:
cumulative_sum += sum(combo_list[:element])
print(cumulative_sum)