2016-04-21 1 views
0

Supposons que j'aie une liste d'éléments, disons des nombres entiers, que je voudrais diviser en sous-listes de taille presque égale. C'est assez facile à faire avec numpy ...Python diviser la liste d'éléments selon une pondération

MyList = range(30) 
numpy.array_split(MyList, 3) 

.... ou avec un code personnalisé ....

nSubLists = 3 
subList =[] 
i = 0 
for item in MyList: 
    for i in range(nSubList): 
    subList[i].append(item) 
    if i > nSubLists: 
    i = 0 
    else: 
    i = i + 1 

Mais supposons que maintenant que je ne veux pas les articles distribués à parts égales entre les subsists. Supposons, je veux les distribuer selon une certaine pondération

par exemple.

wgtList1 = 20% 
wgtList2 = 30% 
wgtList3 = 50% 

Lorsque les% montrent la fraction des éléments de la liste d'origine que je veux dans chaque sous-liste. Évidemment, si la liste ne se divise pas uniformément en fonction des pourcentages ou des fractions, il peut s'agir de la division d'entier la plus proche.

Quelle est la meilleure façon d'appliquer de telles pondérations à la liste de partage en Python?

Répondre

0

Je ne suis pas expert en python, mais la solution programmatique je peux penser serait quelque chose comme ceci:

def split(original_list, weight_list): 
    sublists = [] 
    prev_index = 0 
    for weight in weight_list: 
     next_index = math.ceil((len(my_list) * weight)) 

     sublists.append(my_list[prev_index : next_index]) 
     prev_index = next_index 

    return sublists 

## function call ## 
my_list = [...] # whatever your list contains 
weight_list = [0.2, 0.3, 0.5] # This equals to your 20%, 30% and 50% 

sublists = split(my_list, weight_list)