Python itertools.product() 获取项目索引
Python itertools.product() get item index
我有一个给定的元组 my_tuple
,我知道它在 itertools.product() 的 return 对象中。如何在不遍历 itertools.product() 对象的情况下找到 my_tuple
的索引?
import itertools
permutations = itertools.product(my_sorted_list, repeat = perm_length)
预期输出类似于 any_list.index(interesting_pattern)
编辑 请注意,由于内存限制,我无法在对象上使用 list()
使用 Python 2.7
在这种情况下您不想使用 itertools.product
。如果你只想要索引,那么你应该用数学来计算它。
就像其他人之前说的,这个很慢并且需要很多内存:
import itertools
print list(itertools.product([0, 2, 3, 5], repeat=3)).index((3, 0, 2))
更好的是:
def product_index(sorted_list, repeat, interesting_pattern):
result = 0
for index, number in enumerate(interesting_pattern):
result += sorted_list.index(number) * len(sorted_list)**(repeat - 1 - index)
return result
print product_index([0, 2, 3, 5], 3, (3, 0, 2))
解释:
看看list(itertools([0, 2, 3, 5], repeat=3))
的输出:
[(0, 0, 0), (0, 0, 2), (0, 0, 3), (0, 0, 5), (0, 2, 0), (0, 2, 2), (0, 2, 3),
(0, 2, 5), (0, 3, 0), (0, 3, 2), (0, 3, 3), (0, 3, 5), (0, 5, 0), (0, 5, 2),
(0, 5, 3), (0, 5, 5), (2, 0, 0), (2, 0, 2), (2, 0, 3), (2, 0, 5), (2, 2, 0),
(2, 2, 2), (2, 2, 3), (2, 2, 5), (2, 3, 0), (2, 3, 2), (2, 3, 3), (2, 3, 5),
(2, 5, 0), (2, 5, 2), (2, 5, 3), (2, 5, 5), (3, 0, 0), (3, 0, 2), (3, 0, 3),
(3, 0, 5), (3, 2, 0), (3, 2, 2), (3, 2, 3), (3, 2, 5), ...]
由于输入列表已排序,因此生成的元组也已排序。首先 itertools.product
生成所有长度为 3
且以 0
开头的元组。然后就是以2
开头的所有长度为3
的元组。等等。
所以算法遍历 interesting_pattern
的每个元素并确定这些元组中有多少以较小的数字开头。
所以对于 interesting_pattern = (3, 0, 2)
我们有:
- 有多少个长度为
3
的元组,其中第一个元素小于 3
?对于第一个元素,有 2 种可能性(0
和 2
),所有其他元素可以是一切(4 种可能性)。所以有2*4*4 = 2*4^2 = 32
。现在我们有了第一个数字 3,只需要看子元组 (0, 2)
。
有多少个长度为 2
的元组,其中第一个元素小于 0
?第一个元素没有可能,但是第二个元素有 4 种可能,所以 0*4 = 0*4^1 = 0
。
最后。有多少个长度为 1
的元组,其中第一个元素小于 2
?第一个元素 (0
) 有 1 种可能性,所以 1 = 1*4^0 = 1
。
我们总共得到 32 + 0 + 1 = 33
。索引是33
。
编辑:
此算法可能更快,因为您不必计算任何幂。
def product_index2(sorted_list, interesting_pattern):
result = 0
for number in interesting_pattern:
result = result * len(sorted_list) + sorted_list.index(number)
return result
我有一个给定的元组 my_tuple
,我知道它在 itertools.product() 的 return 对象中。如何在不遍历 itertools.product() 对象的情况下找到 my_tuple
的索引?
import itertools
permutations = itertools.product(my_sorted_list, repeat = perm_length)
预期输出类似于 any_list.index(interesting_pattern)
编辑 请注意,由于内存限制,我无法在对象上使用 list()
使用 Python 2.7
在这种情况下您不想使用 itertools.product
。如果你只想要索引,那么你应该用数学来计算它。
就像其他人之前说的,这个很慢并且需要很多内存:
import itertools
print list(itertools.product([0, 2, 3, 5], repeat=3)).index((3, 0, 2))
更好的是:
def product_index(sorted_list, repeat, interesting_pattern):
result = 0
for index, number in enumerate(interesting_pattern):
result += sorted_list.index(number) * len(sorted_list)**(repeat - 1 - index)
return result
print product_index([0, 2, 3, 5], 3, (3, 0, 2))
解释:
看看list(itertools([0, 2, 3, 5], repeat=3))
的输出:
[(0, 0, 0), (0, 0, 2), (0, 0, 3), (0, 0, 5), (0, 2, 0), (0, 2, 2), (0, 2, 3),
(0, 2, 5), (0, 3, 0), (0, 3, 2), (0, 3, 3), (0, 3, 5), (0, 5, 0), (0, 5, 2),
(0, 5, 3), (0, 5, 5), (2, 0, 0), (2, 0, 2), (2, 0, 3), (2, 0, 5), (2, 2, 0),
(2, 2, 2), (2, 2, 3), (2, 2, 5), (2, 3, 0), (2, 3, 2), (2, 3, 3), (2, 3, 5),
(2, 5, 0), (2, 5, 2), (2, 5, 3), (2, 5, 5), (3, 0, 0), (3, 0, 2), (3, 0, 3),
(3, 0, 5), (3, 2, 0), (3, 2, 2), (3, 2, 3), (3, 2, 5), ...]
由于输入列表已排序,因此生成的元组也已排序。首先 itertools.product
生成所有长度为 3
且以 0
开头的元组。然后就是以2
开头的所有长度为3
的元组。等等。
所以算法遍历 interesting_pattern
的每个元素并确定这些元组中有多少以较小的数字开头。
所以对于 interesting_pattern = (3, 0, 2)
我们有:
- 有多少个长度为
3
的元组,其中第一个元素小于3
?对于第一个元素,有 2 种可能性(0
和2
),所有其他元素可以是一切(4 种可能性)。所以有2*4*4 = 2*4^2 = 32
。现在我们有了第一个数字 3,只需要看子元组(0, 2)
。 有多少个长度为
2
的元组,其中第一个元素小于0
?第一个元素没有可能,但是第二个元素有 4 种可能,所以0*4 = 0*4^1 = 0
。最后。有多少个长度为
1
的元组,其中第一个元素小于2
?第一个元素 (0
) 有 1 种可能性,所以1 = 1*4^0 = 1
。
我们总共得到 32 + 0 + 1 = 33
。索引是33
。
编辑:
此算法可能更快,因为您不必计算任何幂。
def product_index2(sorted_list, interesting_pattern):
result = 0
for number in interesting_pattern:
result = result * len(sorted_list) + sorted_list.index(number)
return result