2016-09-01 5 views
0

ここでは、dicのリストを持っています。ここでは、dicの1番目の要素に等しい重複を削除したいと思います。 入力:私が試したと予想される出力を持っているリストの最初のdicの要素が繰り返された場合は、dic全体をポップアウトしますか?

data = [ 

    [ 
      [{'color': '1'},{'color': '0'},{'color': '2'},{'color': '1'}], 
      [{'color': '2'},{'color': '3'},{'color': '2'},{'color': '5'}], 
      [{'color': '1'},{'color': '1'},{'color': '3'},{'color': '3'}] 
    ], 

    [ 
      [{'color': '1'},{'color': '1'},{'color': '4'},{'color': '4'}], 
      [{'color': '4'},{'color': '3'},{'color': '1'},{'color': '4'}], 
      [{'color': '7'},{'color': '1'},{'color': '7'},{'color': '1'}] 
    ] 

     ] 

、同じことを達成するための任意の神託の方法はありますか?

コード:

new = [] ; 
for i in data: 
    master = [] 
    for j in i: 
     temp = [] 
     for k in j: 
      if j[0]['color'] != k['color']: 
       temp.append(k) 
     temp.insert(0,j[0]) 
     master.append(temp) 
    new.append(master) 
print(new) 

予想される出力:

data = [ 

    [ 
      [{'color': '1'},{'color': '0'},{'color': '2'}], 
      [{'color': '2'},{'color': '3'},{'color': '5'}], 
      [{'color': '1'},{'color': '3'},{'color': '3'}] 
    ], 

    [ 
      [{'color': '1'},{'color': '4'},{'color': '4'}], 
      [{'color': '4'},{'color': '3'},{'color': '5'}], 
      [{'color': '7'},{'color': '1'},{'color': '1'}] 
    ]  
    ] 

答えて

2

すべての一時リストは必要ない:

サブ項目のそれぞれを通る基本的にはそれだけの繰り返し処理
for item in data: 
    for i,subitem in enumerate(item): 
     item[i] = [item[i][0]] + [dct for dct in item[i][1:] 
            if dct['color'] != item[i][0]['color']] 

と、それに取って代わりますその最初の項目と残りの項目が同じ値を持たないものとします。それは醜いですが

することは、あなたも(可読性ので、例示の目的のみのために...私はそれをお勧めしません)ワンライナーにそれを減らすことができます

data = [[[item[i][0]] + [dct for dct in item[i][1:] if dct['color'] != item[i][0]['color']] for i,subitem in enumerate(item)] for item in data] 
+0

@akashkarothiyaはい、それはの続きです前の行 – glibdud

+0

デモhttps://repl.it/DIARを確認してください。予想される出力と少し異なります。 –

+0

@akashkarothiya 'item'ではなく' data'を出力してください。 'item'は' for'ループで使用される一時変数です。 – glibdud

関連する問題