[英]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.