"TypeError: 'int' object is not iterable" when moving itertools product inside function
"TypeError: 'int' object is not iterable" when moving itertools product inside function
我正在尝试将 itertools.product
的用法移动到函数内部。当我尝试执行此操作时,出现以下错误消息,我不确定原因:
TypeError: 'int' object is not iterable
代码如下。在main
函数中可以看到函数外使用的算法然后在函数中可以看到封装时使用的算法:
#!/usr/bin/env python
import itertools
def main():
elements_specification = [[10, 20], [30, 40], [50, 60]]
lists = [list(list_generated) for index, element_specification in enumerate(elements_specification) for list_generated in itertools.product(*elements_specification[:index + 1])]
for list_configuration in lists:
print(list_configuration)
print("---")
for list_configuration in list_element_combinations_variadic(
[[10, 20], [30, 40], [50, 60]]
):
print(list_configuration)
def list_element_combinations_variadic(
elements_specification
):
"""
This function accepts a specification of lists of elements for each place in
lists in the form of a list, the elements of which are lists of possible
elements and returns a list of lists corresponding to the combinations of
elements of the specification with varying numbers of elements.
For example, the list elements specification [[10, 20], [30, 40], [50, 60]]
yields the following lists:
[10]
[20]
[10, 30]
[10, 40]
[20, 30]
[20, 40]
[10, 30, 50]
[10, 30, 60]
[10, 40, 50]
[10, 40, 60]
[20, 30, 50]
[20, 30, 60]
[20, 40, 50]
[20, 40, 60]
"""
lists = [list(list_generated) for index, elements_specification in enumerate(elements_specification) for list_generated in itertools.product(*elements_specification[:index + 1])]
return lists
if __name__ == "__main__":
main()
基本上,您在 main
方法和另一个方法之间有错字。
在 main
中,element_specification
在 for
中是正确的
for index, element_specification in enumerate(elements_specification)
但在另一种方法中,您在 for
中有 elements_specification
for index, elements_specification in enumerate(elements_specification)
恰好是该方法的参数名称,因此您要在列表理解中重新分配该参数
试试这个
lists = [list(list_generated) for index, element in enumerate(elements_specification) for list_generated in itertools.product(*elements_specification[:index + 1])]
return lists
或者因为您甚至不需要 enumerate
中的 element
,只需使用 range
。
lists = [list(list_generated) for index in range(len(elements_specification)) for list_generated in itertools.product(*elements_specification[:index + 1])]
return lists
我正在尝试将 itertools.product
的用法移动到函数内部。当我尝试执行此操作时,出现以下错误消息,我不确定原因:
TypeError: 'int' object is not iterable
代码如下。在main
函数中可以看到函数外使用的算法然后在函数中可以看到封装时使用的算法:
#!/usr/bin/env python
import itertools
def main():
elements_specification = [[10, 20], [30, 40], [50, 60]]
lists = [list(list_generated) for index, element_specification in enumerate(elements_specification) for list_generated in itertools.product(*elements_specification[:index + 1])]
for list_configuration in lists:
print(list_configuration)
print("---")
for list_configuration in list_element_combinations_variadic(
[[10, 20], [30, 40], [50, 60]]
):
print(list_configuration)
def list_element_combinations_variadic(
elements_specification
):
"""
This function accepts a specification of lists of elements for each place in
lists in the form of a list, the elements of which are lists of possible
elements and returns a list of lists corresponding to the combinations of
elements of the specification with varying numbers of elements.
For example, the list elements specification [[10, 20], [30, 40], [50, 60]]
yields the following lists:
[10]
[20]
[10, 30]
[10, 40]
[20, 30]
[20, 40]
[10, 30, 50]
[10, 30, 60]
[10, 40, 50]
[10, 40, 60]
[20, 30, 50]
[20, 30, 60]
[20, 40, 50]
[20, 40, 60]
"""
lists = [list(list_generated) for index, elements_specification in enumerate(elements_specification) for list_generated in itertools.product(*elements_specification[:index + 1])]
return lists
if __name__ == "__main__":
main()
基本上,您在 main
方法和另一个方法之间有错字。
在 main
中,element_specification
在 for
for index, element_specification in enumerate(elements_specification)
但在另一种方法中,您在 for
elements_specification
for index, elements_specification in enumerate(elements_specification)
恰好是该方法的参数名称,因此您要在列表理解中重新分配该参数
试试这个
lists = [list(list_generated) for index, element in enumerate(elements_specification) for list_generated in itertools.product(*elements_specification[:index + 1])]
return lists
或者因为您甚至不需要 enumerate
中的 element
,只需使用 range
。
lists = [list(list_generated) for index in range(len(elements_specification)) for list_generated in itertools.product(*elements_specification[:index + 1])]
return lists