将列表中的整数排序到箱中

pic*_*olo 1 python list-comprehension list

我有一个名为shoeizes和quantity的整数列表.鞋类列表中的整数表示为在数量列表中具有数量(在相同索引中)的箱.我想重新组织清单,以便我按照升序排列鞋子,每个鞋子的所有数量总和在一起.

shoesizes    = [ 2 ,  5 ,  6 , 1 , 3 , 2 ,  4 ,  5 , 2 , 3 , 1 ]    
quantities   = [ 50, 100, 120, 20, 40, 10, 90 , 10 ,30 , 20, 80]
Run Code Online (Sandbox Code Playgroud)

所以期望的输出将是:

orderedsizes = [ 1 , 2 , 3 , 4 , 5 ,  6 ]
totalquant   = [100, 90, 60, 90,110, 120] 
Run Code Online (Sandbox Code Playgroud)

Sha*_*ger 5

既然你需要排序,itertools.groupby可以很好地用来做到这一点:

from operator import itemgetter
from itertools import groupby

shoesizes    = [ 2 ,  5 ,  6 , 1 , 3 , 2 ,  4 ,  5 , 2 , 3 , 1 ]    
quantities   = [ 50, 100, 120, 20, 40, 10, 90 , 10 ,30 , 20, 80]

# For convenience, short names for itemgetters
getsize, getcnt = itemgetter(0), itemgetter(1)

# Sort to bins of same size next to each other
sorted_bins = sorted(zip(shoesizes, quantities), key=getsize)

# Group and sum bins of same size
summed_sizes = [(k, sum(map(getcnt, g))) for k, g in groupby(sorted_bins, key=getsize)]

# Convert back to separate lists
orderedsizes, totalquant = map(list, zip(*summed_sizes))

print(orderedsizes)
print(totalquant)
Run Code Online (Sandbox Code Playgroud)

哪个输出:

[1, 2, 3, 4, 5, 6]
[100, 90, 60, 90, 110, 120]
Run Code Online (Sandbox Code Playgroud)

它也可以做到这一点与collections.Counter(或只collections.defaultdict(int)),然后排序.items()Counter; 除非箱子的数量巨大,否则性能差异不太重要; 如果你不想在第一时间排序,Counter通过完全避免排序更有意义.示例代码:

from collections import defaultdict

size_counts = defaultdict(int)
for size, cnt in zip(shoesizes, quantities):
    size_counts[size] += cnt

orderedsizes, totalquant = map(list, zip(*sorted(size_counts.items())))
Run Code Online (Sandbox Code Playgroud)