2011-12-22 13 views
0

私はこのフォーマットの異なるアイテムの毎月の合計数を含む最も外側のリストを持っています。毎月同じ項目があります。Pythonのタプルの最初のフィールドの合計に基づいてタプルのリストをソート

big_list = [ 
    [ 
    (20, 'Item A', 'Jan'), 
    (30, 'Item B', 'Jan'), 
    (12, 'Item C', 'Jan'), 
    ], 
    [ 
    (22, 'Item A', 'Feb'), 
    (34, 'Item B', 'Feb'), 
    (15, 'Item C', 'Feb'), 
    ], 

    .... # until 'Dec' 
] 

このリストは、1年間のアイテム数の合計に基づいて並べ替える必要があります。 (年間を通して特定の項目のタプルの最初のフィールドの合計)Item CItem AItem B続く2ヶ月で最もカウントを持っている場合たとえば、最終的な結果は以下のようになり

[ 
    [ 
    (12, 'Item C', 'Jan'), 
    (20, 'Item A', 'Jan'), 
    (30, 'Item B', 'Jan'), 
    ], 
    [ 
    (15, 'Item C', 'Feb'), 
    (22, 'Item A', 'Feb'), 
    (34, 'Item B', 'Feb'), 
    ], 

    ... # until 'Dec' 
] 
# Item C = 12 + 15 = 27 
# Item A = 20 + 22 = 42 
# Item B = 30 + 34 = 64 

私はこれをどのように達成することができますか?どんな援助や啓発も大いに感謝されます。

+0

をサブリスト内の要素は、常に同じ順序で来るのか? – soulcheck

+1

あなたの例では、 'Item C'が最も多く(タプルの最初のフィールドの合計?)、その後に' Item A'がありますが、そうではないようです。 「アイテムC」のカウントが最も少なく、「アイテムB」が最も多い。 – MattH

+0

ああ、それについては残念です。注文(昇順/降順)はソートされていれば問題ありません。 –

答えて

3
big_list = [ 
    [ 
    (20, 'Item A', 'Jan'), 
    (30, 'Item B', 'Jan'), 
    (12, 'Item C', 'Jan'), 
    ], 
    [ 
    (22, 'Item A', 'Feb'), 
    (34, 'Item B', 'Feb'), 
    (15, 'Item C', 'Feb'), 
    ]] 

s = {} 
for l in big_list: 
    for m in l: 
     s[m[1]] = s.get(m[1], 0) + m[0] 

は私たちにsを与える - 私たちはソートするために使用する合計:{'Item A': 42, 'Item B': 64, 'Item C': 27}

そして最後に:このソリューションは、のために働く

[[(12, 'Item C', 'Jan'), (20, 'Item A', 'Jan'), (30, 'Item B', 'Jan')], 
[(15, 'Item C', 'Feb'), (22, 'Item A', 'Feb'), (34, 'Item B', 'Feb')]] 

for l in big_list: 
    l.sort(key=lambda x: s[x[1]]) 

はにbig_listを変更します任意の順序で数ヶ月以内に一覧表示する一部の月に商品が表示されません。

0

@Pankratは近くにあった:

for inner in big_list: 
    inner.sort() 

シンプルlist.sort()はちょうどそれを上の動作しませんので、あなたは、内側のリストのリストを持っています。ソートするには内部レベルリストに入る必要があります(タプルを保持します)。

あなたのケースでは、タプルの最初の要素をソートする必要があります。

for inner in big_list: 
    inner.sort(key = lambda x: x[i]) # i is the index location you want to sort on 
0

私の提案された解決策:その後BIGLISTがソートされ

[sublist.sort() for sublist in biglist] 

あなたが他の人を並べ替える必要があった場合、あなたはそのような何かを、必要になります。あなたはリストの理解を割り当てる必要はありません!

+1

この例では機能しますが、正解ではありません。年間合計でソートします。 – eumiro

+0

これはこの例の解決策です。それはOPが何を求めても何も求めなかった。それは答えではなく、あなたの例は確かにより包括的であり、範囲が広いです。 –

1

あなたが実際には2つのライナーが必要な場合:

for small_list in big_list: 
    small_list.sort(key=lambda x: -sum([y[0] for l in big_list for y in l if y[1] == x[1]])) 

が編集: あるいはワンライナー

[sorted(small_list, key=lambda x: -sum([y[0] for l in big_list for y in l if y[1] == x[1]])) for small_list in big_list] 
+0

各要素の合計を計算するので、@ eumiroの方が適していることに注意してください。 – soulcheck

関連する問題