2017-10-17 14 views
3

大文字と国を含む複数のJSONファイルがあります。すべてのファイルから繰り返しキーと値のペアを削除するにはどうすればよいですか?複数のJSONファイルから繰り返しを削除するにはどうすればよいですか?

私は、次のJSONファイルの1

{ 
    "data": [ 
    { 
     "Capital": "Berlin", 
     "Country": "Germany" 
    }, 
    { 
     "Capital": "New Delhi", 
     "Country": "India" 
    }, 
    { 
     "Capital": "Canberra", 
     "Country": "Australia" 
    }, 
    { 
     "Capital": "Beijing.", 
     "Country": "China" 
    }, 
    { 
     "Capital": "Tokyo", 
     "Country": "Japan" 
    }, 
    { 
     "Capital": "Tokyo", 
     "Country": "Japan" 
    }, 
    { 
     "Capital": "Berlin", 
     "Country": "Germany" 
    }, 
    { 
     "Capital": "Moscow", 
     "Country": "Russia" 
    }, 
    { 
     "Capital": "New Delhi", 
     "Country": "India" 
    }, 
    { 
     "Capital": "Ottawa", 
     "Country": "Canada" 
    } 
    ] 

} 

反復を含む多くのそのようなJSONファイルがありますしている私は、私はこれを試してみました?のみ最初の出現を維持repetitve項目を削除しますが、doesnのかitems.How仕事は

dupes = [] 
for f in json_files: 
    with open(f) as json_data: 
     nations = json.load(json_data)['data'] 
     #takes care of duplicates and stores it in dupes 
     dupes.append(x for x in nations if x['Capital'] in seen or seen.add(x['Capital'])) 
     nations = [x for x in nations if x not in dupes] #want to keep the first occurance of the item present in dupes 

    with open(f, 'w') as json_data: 
     json.dump({'data': nations}, json_data) 

答えて

1

リストの内包は素晴らしいです!しかし、... ifステートメントが途中であるときにコードを複雑にすることができます。

これは決してありません。お守りです。それどころか、リストの理解を頻繁に使用することをお勧めします。この特定のケースでは、より広範なソリューションがより読みやすくなります。

私の提案はこれです:

import json 

seen = [] 
result = [] 

with open('data.json') as json_data: 
    nations = json.load(json_data)['data'] 
    #takes care of duplicates and stores it in dupes 
    for item in nations: 
     if item['Capital'] not in seen: 
      seen.append(item['Capital']) 
      result.append(item) 

with open('data.no_dup.json', 'w') as json_data: 
    json.dump({'data': result}, json_data) 

検査済みとPython 3.5.2で動作します。

私は便宜のために外側ループを削除しています。あなたはおそらく、クールなリストの内包表記を使用することはできませんが、定期的にループがすべき

[{u'Country': u'Russia', u'Capital': u'Moscow'}, {u'Country': u'Japan', u'Capital': u'Tokyo'}, {u'Country': u'Canada', u'Capital': u'Ottawa'}, {u'Country': u'India', u'Capital': u'New Delhi'}, {u'Country': u'Germany', u'Capital': u'Berlin'}, {u'Country': u'Australia', u'Capital': u'Canberra'}, {u'Country': u'China', u'Capital': u'Beijing.'}] 
7 
+0

あなたのコードは私が達成したいと思っているもののためにうまくいきます。ありがとう! –

0

は、あなたが与えられたJSON

import json 

files = ['countries.json'] 

for f in files: 
    with open(f,'r') as fp: 
     nations = json.load(fp) 
    result = [dict(tupleized) for tupleized in set(tuple(item.items())\ 
      for item in nations['data'])] 
print result 
print len(result) 

出力のためにこれを達成する方法のサンプルコードです仕事

+0

これは、重複するペアのみを除外することに注意してください。 '{'国': 'ロシア'、 '首都': 'モスクワ'}'と '{'国': 'ザイール'、 '首都': 'モスクワ'} 'は両方とも'結果 'になります – jpyams

2

:後

+0

これはJSではなく、 'nation.country'は動作しません。 – nutmeg64

+0

@ nutmeg64私は長い間誰かが 'python.js'を作ってくれると確信しています;) – jpyams

関連する問題