2016-09-15 25 views
0

に私が辞書を作成し、リストに追加するラインによるExcelファイルの読み取りラインを通じて実行していますので、私のようなリストがある場合:更新辞書リスト

myList = [] 

と、この形式の辞書を:

dictionary = {'name': 'John', 'code': 'code1', 'date': [123,456]} 

だから私はこれを行う:myList.append(dictionary)、それほど良い。今、私は私はかなり類似した辞書を持って次の行に行くよ:

dictionary_two = {'name': 'John', 'code': 'code1', 'date': [789]} 

私はので、私はこの機能でそれを確認し、私はすでにmyList'name' = 'John'と辞書を持っているかどうかを確認したいと思います:

def checkGuy(dude_name): 
    return any(d['name'] == dude_name for d in myList) 

は現在、私は、リストに人を追加するには、この機能を書いている:この他で

def addGuy(row_info): 
     if not checkGuy(row_info[1]): 
      myList.append({'name':row_info[1],'code':row_info[0],'date':[row_info[2]]}) 
     else: 
      #HELP HERE 

私はdict.update(updated_dict)したいのですが、私はしないでくださいここで辞書を取得する方法を知っている。

dictionaryにはdictionary_twoの値が追加されますか?

+2

「myList」をキーとする辞書を作るのはなぜですか? – Barmar

+0

'checkGuy'はブール値ではなく、一致する要素を返すことができます。辞書を返す場合は更新し、そうでない場合は新しい辞書を追加します。 – Barmar

+0

@Barmarより多くの名前があるので、それは辞書のリストでより整理されるだろうと思う。辞書フォーマットをクラスにすることも考えましたが、この時点ではオブジェクトを扱うには十分に快適ではありません。編集:それは実際に悪い考えではない... – Onilol

答えて

2

私のようなものにcheckGuyを変更します:

def findGuy(dude_name): 
    for d in myList: 
     if d['name'] == dude_name: 
      return d 
    else: 
     return None # or use pass 

そして実行します。

def addGuy(row_info): 
    guy = findGuy(row_info[1]) 
    if guy is None: 
     myList.append({'name':row_info[1],'code':row_info[0],'date':[row_info[2]]}) 
    else: 
     guy.update(updated_dict) 
+0

なぜ 'd'ではなく' i'を返しますか? – Barmar

+0

@Barmar私はdictsが簡単にスワップすることができると思う、代わりに –

+0

を更新するのではなく、それは公正な点です。より一般的です。 – Barmar

0

この回答の提案は、それがあれば「名前は」のみであることが示唆されたコメントに貼付されていますそれを検索する基準は、リストを使用する代わりに辞書のキーとして使用することができます。

master = {"John" : {'code': 'code1', 'date': [123,456]}} 

def addGuy(row_info): 
    key = row_info[1] 
    code = row_info[0] 
    date = row_info[2] 
    if master.get(key): 
     master.get(key).update({"code": code, "date": date}) 
    else: 
     master[key] = {"code": code, "date": date} 
+0

なぜ投票結果が正確ですか?その答えは、リストの代わりに辞書を使って回答を説明するためのコメントの要請に応えたものです。 – Will

+0

これは 'master [key] = {" code ":code、" date ":date}'と同じですが、更新が上書きされるので同じになります。 –

+0

質問を更新しました – Onilol

0

あなたが繰り返し名前を見るたびdict.update既存のデータならば、あなたのコードは、ファイルを読み込み、右dictsの辞書に削減することができます。既存のdictsを同じキーで更新すると、最後のオカレンスを残す値が上書きされるため、複数の "John"ディクテーションを持っていても、最後まで同じデータがすべて含まれます。

def read_file(): 
    results = {name: {"code": code, "date": date} 
       for code, name, date in how_you_read_into_rows} 

実際に値が何らかの形で付加されていると考えると、間違っています。あなたがそれをしたいならば、あなたは非常に異なるアプローチが必要です。

from collections import defaultdict 
d = defaultdict(list) 
def read_file(): 
    for code, name, date in how_you_read_into_rows: 
     d["name"].append([code, date]) 

またはいくつかのバリエーションが欲しいものに応じて:あなたは、実際にユーザーごとの日付とコードを収集したい場合は、キーとして名前をリストにdefauldictコードを追加し、日付のペアを使用します最終的な出力は次のようになります。