步骤1 :给定数字列表,仅给定所需组的最终数量,生成所有可能的分组(按顺序)。
例如,如果我的数字列表是1到4,并且我想要2个最终组,则可能是:
[1], [2,3,4]
[1,2], [3,4]
[1,2,3], [4]
步骤2 :对这些组执行算术运算。
例如,如果我们选择加法,则最终结果将是:
1 + 234 = 235
12 + 34 = 46
123 + 4 = 127
先验研究和类似问题
我已经在SO和其他地方看到了许多有关涉及可变 数量 组的问题的示例,这些问题利用范围和for循环,例如:
print [num_list[i:i+groups] for i in range(0,len(num_list),groups)]
但这与我想要的相反-在那里,组的长度固定,最后一个组除外,并且组的数量振荡。
这不是家庭作业,只是我遇到的一个有趣的问题。理想情况下,我需要能够遍历那些单独的子列表以执行数学运算,因此也需要捕获它们。
我有一个解决方案将涉及itertools的感觉,但我似乎无法弄清楚组合方面的组合。
编辑/扩展步骤2
如果要在每个分区上执行 不同的 操作,是否仍可以采用相同的方法?而不是仅指定int。 添加
,我能以某种方式执行所有主要4种操作的另一种组合吗?即:
symbol_list = ['+','-','*','/']
for op in symbol_list:
#something
我想到了以下可能性:
1 + 2 * 34
1 * 2 - 34
1 / 2 + 34
etc.
操作顺序可以 忽略 。
#!/usr/bin/env python
import sys
from itertools import combinations, chain, product
# fixed vars
num_list = range(_,_) # the initial list
groups = _ # number of groups
target = _ # any target desired
op_dict = {'+': int.__add__, '-': int.__sub__,
'*': int.__mul__, '/': int.__div__}
def op_iter_reduce(ops, values):
op_iter = lambda a, (i, b): op_dict[ops[i]](a, b)
return reduce(op_iter, enumerate(values[1:]), values[0])
def split_list(data, n):
for splits in combinations(range(1, len(data)), n-1):
result = []
prev = None
for split in chain(splits, [None]):
result.append(data[prev:split])
prev = split
yield result
def list_to_int(data):
result = 0
for h, v in enumerate(reversed(data)):
result += 10**h * v
return result
def group_and_map(data, num_groups):
template = ['']*(num_groups*2 - 1) + ['=', '']
for groups in split_list(data, num_groups):
ints = map(list_to_int, groups)
template[:-2:2] = map(str, ints)
for ops in product('+-*/', repeat=num_groups-1):
template[1:-2:2] = ops
template[-1] = str(op_iter_reduce(ops, ints))
if op_iter_reduce(ops, ints) == target:
print ' '.join(template)
group_and_map(num_list, groups)
第1步 :我发现想将列表分成几类的最简单方法是尝试获得分割位置的组合。这是一个实现:
def split_list(data, n):
from itertools import combinations, chain
for splits in combinations(range(1, len(data)), n-1):
result = []
prev = None
for split in chain(splits, [None]):
result.append(data[prev:split])
prev = split
yield result
>>> list(split_list([1, 2, 3, 4], 2))
[[[1], [2, 3, 4]], [[1, 2], [3, 4]], [[1, 2, 3], [4]]]
>>> list(split_list([1, 2, 3, 4], 3))
[[[1], [2], [3, 4]], [[1], [2, 3], [4]], [[1, 2], [3], [4]]]
第2步 :首先,你需要转换就像一个列表[[1], [2, 3, 4]]
,一个像[1, 234]
。您可以使用以下功能执行此操作:
def list_to_int(data):
result = 0
for i, v in enumerate(reversed(data)):
result += 10**i * v
return result
>>> map(list_to_int, [[1], [2, 3], [4, 5, 6]])
[1, 23, 456]
现在,您可以使用reduce()
以下命令在结果列表上执行操作:
>>> import operator
>>> reduce(operator.add, [1, 23, 456]) # or int.__add__ instead of operator.add
480
完整的解决方案: 基于不同操作员的编辑引用需求:
def op_iter_reduce(ops, values):
op_dict = {'+': int.__add__, '-': int.__sub__,
'*': int.__mul__, '/': int.__div__}
op_iter = lambda a, (i, b): op_dict[ops[i]](a, b)
return reduce(op_iter, enumerate(values[1:]), values[0])
def group_and_map(data, num_groups):
from itertools import combinations_with_replacement
op_dict = {'+': int.__add__, '-': int.__sub__,
'*': int.__mul__, '/': int.__div__}
template = ['']*(num_groups*2 - 1) + ['=', '']
op_iter = lambda a, (i, b): op_dict[ops[i]](a, b)
for groups in split_list(data, num_groups):
ints = map(list_to_int, groups)
template[:-2:2] = map(str, ints)
for ops in combinations_with_replacement('+-*/', num_groups-1):
template[1:-2:2] = ops
template[-1] = str(op_iter_reduce(ops, ints))
print ' '.join(template)
>>> group_and_map([1, 2, 3, 4], 2)
1 + 234 = 235
1 - 234 = -233
1 * 234 = 234
1 / 234 = 0
12 + 34 = 46
12 - 34 = -22
12 * 34 = 408
12 / 34 = 0
123 + 4 = 127
123 - 4 = 119
123 * 4 = 492
123 / 4 = 30
如果您使用的是Python
2.6或更低版本,itertools.combinations_with_replacement()
并且不可用,则可以使用此处链接的配方。
我试图找到Python中提供的一个数的所有可能的因式分解。 例如:1)给定n=12,输出为,f(n)=[[2,2,3],[4,3],[6,2],[12]] 2)给定n=24,输出为,f(n)=[2,2,2,3],[2,2,6],[2,12],[4,6],[8,3],[24]] 2)1)对于n=24,输出为, 我可以做什么来获得相关的结果?
我想用Java中所有可能的方法将一个列表拆分为给定数量的n个子列表。 例如,其中n=3将包括以下列表(但不是一个完整的解决方案-完成将需要更多的空间): 等 我适应了另一个类似的问题的解决方案(以所有可能的方式将列表分割成两个子列表),但它只适用于创建2个子列表的列表,我正在努力掌握如何实现灵活而不是硬编码的子列表数量。 这是我的密码: 我需要创建n个数的EGroup对象添加到,而不是硬编码的2,
例如,我有一个可变大小的列表 我想用各种可能的方法把这个列表分成两部分: 我很确定这不是一个未知的问题,可能有一个算法,但是我找不到。此外,这不应使用任何外部库,而应使用简单的语言功能(循环、条件、方法/函数、变量等)在大多数语言中都可以找到。 我用Python写了一个hackish解决方案: 但是,它使用了库功能,总体上不是很好看。
支持可变长参数列表的函数可以支持任意个传入参数,比如fmt.Println函数就是一个支持可变长参数列表的函数。 package main import "fmt" // 这个函数可以传入任意数量的整型参数 func sum(nums ...int) { fmt.Print(nums, " ") total := 0 for _, num := range nums {
我试图遍历一个字典,其中每个键都包含一个列表,该列表依次包含0到20个子列表。目标是迭代字典1的值,检查它们是否在字典2的任何子列表中用于相同的密钥,如果是,则将1添加到计数器中,而不再次考虑子列表。 代码看起来有点像这样: 这显然不起作用,主要是因为代码无法通过列表和子列表进行分层检查,部分原因是可能不正确的迭代语法。我对嵌套循环和迭代没有最大的把握,这使得这很痛苦。另一种选择是首先使用以下方法
我试图读取一个csv文件,并将其设置为转换为另一种格式,以节省一些工作时间,但当一行的长度小于预期列时,我正在加载它的JTable会引发异常。如果行长度<列长度,是否有方法创建空单元格? 因此,您可以看到getValueAt(int row,int col)方法,如果col超过String[].length将导致错误。