簡體   English   中英

您如何均勻地分布每個具有三個列表中的數值的子列表列表?

[英]How would you evenly distribute a list of sublists that each have a numerical value across three lists?

您如何均勻地分發每個具有值的子列表?

我想將以下列表分為3個列表。

lst = [['a',10],['b',40],['c',10],['d',30],['e',20],['f',100],['g',90],['h',4]]

由於所有值的總和為304,因此三個列表應聚合為約101.3。

這是我想以某種形式產生的結果。

lst1 = [['g',90],['a',10]]
lst2 = [['f',100],['h',4]]
lst3 = [['b',40],['c',10],['d',30],['e',20]]

這是我到目前為止解決它的解決方案,但需要一些工作才能使它更快。

def ListSum(lst):
    lst = map(lambda subli: subli[1],lst)
    return sum(lst)

def EvenlyDistribute(lst):
    #put into bucket until reached, then move to the next bucket
    Lst1 = []
    Lst2 = []
    Lst3 = []
    for subli in lst:
        try:
            if ListSum(Lst1) < 100:
                Lst1.append(subli)
            elif ListSum(Lst2) < 100:
                Lst2.append(subli)
            else:
                Lst3.append(subli)
        except:
            pass
    print Lst1
    print Lst2
    print Lst3

這是一個簡單的實現。 首先,按權重對輸入列表進行排序,然后枚舉,將每個項目添加到最少的完整存儲桶中。

def EvenlyDistribute(lst, n):
    """Distribute items in lst (tuples of (val, weight)) into n buckets"""
    buckets = [[] for i in range(n)]
    weights = [[0, i] for i in range(n)]
    for item in sorted(lst, key=lambda x: x[1], reverse=True):
        idx = weights[0][1]
        buckets[idx].append(item)
        weights[0][0] += item[1]
        weights = sorted(weights)
    return buckets

所以

for i, v in enumerate(EvenlyDistribute(lst, 3)):
    print(v)

回報

[['f', 100], ['h', 4]]
[['g', 90], ['a', 10]]
[['b', 40], ['d', 30], ['e', 20], ['c', 10]]

一個起點緊緊地提出這個問題是用組合技術強制它。 為此你可以使用itertools。 首先計算列表的所有排列(),然后使用組合()檢查每個排列的所有可能組合,這些組合可以為每個排列提供可能的切片點。

然后,您可以檢查每個子列表(sl0-2)的總和的方差,如其他答案中所示。 然后保留具有最小方差的那個並在過程結束時返回該方差。

from itertools import permutations, combinations

for perm in permutations(grades):
    for i in combinations(xrange( len(grades)), 3):
        sl0, sl1, sl2 =  perm[i[0]:i[1]], perm[i[1]:i[2]],  perm[i[2]:]

當然,根據您的列表大小,這將需要一些時間,但它可以很容易地同時編程,例如讓每個進程計算以某個數字開頭的排列,但是我將留下如何為另一個進行編程題。 修剪也是可能的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM