Python中按值对元组列表进行分区
我在Python中有一个元组列表,并希望根据元组的值将其拆分为N个部分,因此最终得到N个部分,其中包含的元组中的值之和尽可能相等 如果这是我的原始数据:Python中按值对元组列表进行分区,python,arrays,list,partitioning,Python,Arrays,List,Partitioning,我在Python中有一个元组列表,并希望根据元组的值将其拆分为N个部分,因此最终得到N个部分,其中包含的元组中的值之和尽可能相等 如果这是我的原始数据: data=[('test',2),('bob',2),('carol',3),('ted',4),('alice',3)] 将其分为两部分: part1=[('test',2),('bob',2),('carol',3)] part2=[('ted',4),('alice',3)] 在Python3中有什么方法可以轻松实现这一点吗?您可以创建这
data=[('test',2),('bob',2),('carol',3),('ted',4),('alice',3)]
将其分为两部分:
part1=[('test',2),('bob',2),('carol',3)]
part2=[('ted',4),('alice',3)]
在Python3中有什么方法可以轻松实现这一点吗?您可以创建这样的通用函数
from itertools import filterfalse
def partition(items: Iterable[T], predicate: Callable[[T], bool]) -> Tuple[List[T], List[T]]:
"Splits items into list of true values and list of false values"
return list(filter(predicate, items)), list(filterfalse(predicate, items))
print(partition([1, 2, 3, 4], lambda i: i >2))
>>> ([3, 4], [1, 2])
据我所知,这没有内置的功能
提供
谓词
参数背后的想法是,您可以提供自己的函数,该函数接受一个项,并返回一个布尔值,以确定它将位于哪个结果集中。我们可以编写一个递归函数来计算最佳分割(或分区)
请注意,复杂性是O(2^N),对于任何分区创建问题都是如此
以下是工作代码:
from copy import copy
def partition(S, A, B):
if len(S) == 0:
return abs(sum([x[1] for x in A]) - sum(x[1] for x in B)), A, B
el = S.pop()
aval, A1, B1 = partition(S.copy(), A.copy() + [el], B.copy())
bval, A2, B2 = partition(S.copy(), A.copy(), B.copy() + [el])
if aval < bval:
return aval, A1, B1
else:
return bval, A2, B2
data=[('test',2),('bob',2),('carol',3),('ted',4),('alice',3)]
mindiff, A, B = partition(data, [], [])
print(A, B, "|| Partition-diff:", mindiff)
你的意思是说,如果有一个功能用于此?你关心性能吗?没有性能不是一个真正的问题。在这种情况下,只有完成才算数
**[('carol', 3), ('bob', 2), ('test', 2)] [('alice', 3), ('ted', 4)]** || Partition-diff: 0