2016-09-06 11 views
1

タプルのリストがあります。キーが空のときはいつでも、前のタプル値に対応値を追加します。キーが空で、以前のタプル値に対応値を追加するとタプルが分割されます

私はこれを伝統的な方法で達成することができますが、それは醜いですね。 これを達成するためのピジョンの方法はありますか?

入力:

data= [('A', 12), ('', 1), ('B', 12), ('', 1), ('C', 12), ('', 1), ('D', 13)] 

予想される出力:

[13, 26, 39, 52] 

マイCODE:

data = [('A', 12), ('', 1), ('B', 12), ('', 1), ('C', 12), ('', 1), ('D', 13)] 
init = 0 ; splitdata = [] 
for i in data: 
    init = init+i[1] 
    if i[0] == '': 
     splitdata.append(init) 
splitdata.append(init) 
print(splitdata) 
[13, 26, 39, 52] 

答えて

1
reduce(
     lambda lst,item: (((item[0] != '') and lst) or lst[:-1]) + [lst[-1] + item[1]], 
     colLabelGrouped[1:], 
     [colLabelGrouped[0][1]]) 

この減少...

の最初の項目の値からなる初期リストとの
  • 開始、その後
  • 順番に各項目の値を追加...
    • によってcolLabelGrouped内の残りの項目を低減するに添加どちらかに生産され、リストの最後の要素...
      • 完全なリスト(アイテムのキーが空でない場合)、または
      • リストマイナス最後の要素(Iアイテムのキーが空です)。
+0

実際の作業中の回答です。これは私がここで答えを直接入力するためのものであり、私がテストすることができるpythonプロンプトではありません:) –

+0

これは魅力的な働きをしてくれてありがとう: –

1

ここで少し短い蓄積機能を使用して行う方法と、リスト内包表記(それはあまりにも読みやすくなるかもしれません)です:あなたが何かを行うことができます減らす使用

colLabelGrouped = [('A', 12), ('', 1), ('B', 12), ('', 1), ('C', 12), ('', 1), ('D', 13)] 

from itertools import accumulate 
cumsum = list(accumulate([x[1] for x in colLabelGrouped])) 
result = [cumsum[i] for i,x in enumerate(colLabelGrouped) if x[0] == ""] 

if colLabelGrouped[-1][0] != "": 
    result.append(cumsum[-1]) 

print(result) 
+0

OPのサンプルデータはこのケースを含んでいませんでした。行内の複数のブランクキーが考慮される必要があります。たとえば、次のように入力します。 '[(' A '、10)、(' '、2)、(' '、1)、(' B '、12)、(' '、1)、(' C ' ( ''、1)、( 'D'、13)] 'となります。あなたはこれを説明するために答えを書き直すことができますか?私は決してitertoolsのものを使用していないので、私は興味があります:) –

+0

@JEarls今、私は混乱しています...期待された振る舞いから理解したものは、 "空白が計算されるたびに、それは結果に... "あなたはその例からどのような結果を期待していますか? – jadsq

+0

'キーが空のときはいつでも、前のタプル値に対応する値を追加したい、'暗黙の 'を読んでタプルを空のキーで削除する'を読んでいます。その含意が正しい場合、空のキーを持つ* next *タプルも同じ前の(空でないキー)タプルに対応値を追加します。 –

1

このように:

from functools import reduce 

data = [('A', 12), ('', 1), ('B', 12), ('', 1), ('C', 12), ('', 1), ('D', 13)] 
splitdata = reduce(
    lambda res, i: res[:-1] + [res[-1] + i[1]] * (2 if i[0] == '' else 1), 
    data, 
    [0] 
) 
print(splitdata) 
+0

これはPython-3固有のものですか? ( 'x if y else z'の構文ですか?) –

+0

グーグルでは、Python 2.5から追加されています。 –

+0

よろしくお願いいたします。私はまだPython 2.4をプログラミングするのに慣れている古いおならです。 :) –

関連する問題