繁体   English   中英

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

[英]Partitioning a List of Tuples by Value in Python

我在 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)]

有什么方法可以在 Python 3 中轻松地做到这一点?

我们可以编写一个递归函数来计算最佳分割(或分区)。

请注意,复杂性是 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

你可以做一个像这样的通用函数

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])

据我所知,没有内置函数。

提供predicate参数背后的想法是,您可以提供自己的函数,该函数接受一个项目,并返回一个布尔值来确定它将在哪个结果集中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM