Разделить «взвешенный» список / массив на куски одинакового размера - PullRequest
0 голосов
/ 03 июня 2019

У меня есть массив предметов с весом, назначенным каждому предмету.Я хочу разделить его на равные по размеру куски ок.равный совокупный вес.Здесь есть ответ, чтобы сделать это, используя numpy https://stackoverflow.com/a/33555976/10690958 Есть ли простой способ сделать это, используя чистый питон?

Пример массива:

[ ['bob',12],
 ['jack,6],
 ['jim',33],
....
]

или

a, 11
b,2
c, 5
d, 3
e, 3
f, 2

Здесь правильным выводом будет (при условии, что нужно 2 блока)

 [a,11],[b,2] - cumulative weight of 13

и

[c,5],[d,3],[e,3],[f,2] - cumulative weight of 13

Чтобы дополнительно прояснить вопрос, представьте ситуацию сортировки 100человек на 10 лифтов, где мы хотим, чтобы каждый лифт был одинаковым ок.общий вес (сумма весов всех людей в этом лифте).Тогда первым списком станут имена и веса.Это проблема с балансировкой нагрузки.

Ответы [ 2 ]

1 голос
/ 03 июня 2019

Вы просто должны подражать cumsum: построить список, суммирующий веса.В конце вы получите общий вес.Сканируйте список с накопленным весом и создавайте новый блок каждый раз, когда вы достигаете total_weight / number_of_chunks.Код может быть:

 def split(w_list, n_chunks):
    # mimic a cumsum
    s = [0,[]]
    for i in w_list:
        s[0]+= i[1]
        s[1].append(s[0])
    # now scan the lists populating the chunks
    index = 0
    splitted = []
    stop = 0
    chunk = 1
    stop = s[0] / n_chunks
    for i in range(len(w_list)):
        # print(stop, s[1][i])     # uncomment for traces
        if s[1][i] >= stop:        # reached a stop ?
            splitted.append(w_list[index:i+1])    # register a new chunk
            index = i+1
            chunk += 1
            if chunk == n_chunks:                 # ok we can stop
                break
            stop = s[0] * chunk / n_chunks        # next stop
    splitted.append(w_list[index:])               # do not forget last chunk
    return splitted
1 голос
/ 03 июня 2019

Вам нужно что-то вроде этого разделения:

 array =[ ['bob',12],
 ['jack',6],
 ['jim',33],
  ['bob2',1],
 ['jack2',16],
 ['jim2',3],
  ['bob3',7],
 ['jack3',6],
 ['jim3',1],
 ]


array = sorted(array, key= lambda pair: pair[1],  )

summ = sum(pair[1] for pair in array )

chunks = 4

splmitt = summ // chunks

print(array)

print(summ)

print(splmitt)

def split(array, split):

    splarr = []
    tlist = []
    summ = 0

    for pair in array:
        summ += pair[1] 
        tlist.append(pair)     
        if summ > split:
            splarr.append(tlist)
            tlist = []
            summ = 0


if tlist:
    splarr.append(tlist)
return splarr

spl = split(array, splmitt)

import pprint 

pprint.pprint(spl)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...