Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中按值对元组列表进行分区_Python_Arrays_List_Partitioning - Fatal编程技术网

Python中按值对元组列表进行分区

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中有什么方法可以轻松实现这一点吗?您可以创建这

我在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中有什么方法可以轻松实现这一点吗?

您可以创建这样的通用函数

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