2016-01-22 35 views
1

我有一個稱爲鞋子和數量的整數列表。鞋類列表中的整數就像在數量列表中具有數量(在同一索引中)的箱。我想重新整理這些清單,以便我將皮鞋的尺寸從小到大排列,並將每種鞋類的所有數量彙總在一起。將列表中的整數排序到分箱中

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

因此所需的輸出將是:

orderedsizes = [ 1 , 2 , 3 , 4 , 5 , 6 ] 
totalquant = [100, 90, 60, 90,110, 120] 

回答

5

因爲你總有需要排序,itertools.groupby can be used to do this pretty nicely

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) 

,輸出:

[1, 2, 3, 4, 5, 6] 
[100, 90, 60, 90, 110, 120] 

也有可能用0來做到這一點(或只是collections.defaultdict(int)),然後整理Counter.items();除非垃圾箱數量巨大,否則性能差異不大可能;如果您不想首先排序,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()))) 
0

您正在創建帶有重複鍵的字典式結構。我會累積值,就像這樣:

# ordersizes is just the set of unique size values in a list: sorted(list(set(shoesizes))) 

[sum(v for key, v in zip(shoesizes, quantities) if key == index) for index in orderedsizes] 
+1

爲什麼把一個大約'O(N)''來爲O(n log n)的'(這取決於您先排序然後在'dict'族或再排序,以及通過分組得到多少裁減)算法在不需要的情況下轉換爲「O(n ** 2)」算法?我的意思是說,你可以這樣做兩行,但到底是什麼?另外,side-note:'sorted(list(set(鞋)))'冗餘地轉換爲'list'; 'sorted'已經做到了,所以放棄'list'構造函數,並使用'sorted(set(鞋子))'。 – ShadowRanger

相關問題