2017-01-12 8 views
0

Dict = {'Key_1': 'Data_1', 'Key_2': 'Data_2', ..., 'Key_n': 'Data_n'}のような辞書には、昇順で名前が付けられたnキーが含まれています。辞書に特定のキーを付け加える最も平凡な方法

AddNextKey(Dict, NewData)のような方法では、最後のキーnを決定し、新しいn+1を値NewDataに追加する必要があります。 Dictが空の場合、このメソッドはキーKey_1を追加する必要があります。

pythonソリューションでは、これを達成するために2行または3行以上のコードを必要としないことは間違いありません。

備考:辞書の注文は重要ではありません。正しい次のキー(n + 1)だけを追加する必要があります。

誰かからアドバイスをいただけますか?

+9

あなたのキーが数値的に上昇した場合、なぜリストを使用せずにリストの最後に追加するのですか? – turbulencetoo

+1

あなたの現在のソリューションとは何ですか? – jonrsharpe

+0

何ですか?私の理解によれば、「dict」は順不同です。彼らはどうやって上昇していますか?少し説明していただけますか?鍵は継続しているのですか? –

答えて

1

辞書には順序がありません。そして最後に挿入された要素を取得することはできません。

は、この例を見てみましょう:あなたが見ることができるように

>>> {'Key_1': 'Data_1', 'Key_2': 'Data_2'} == {'Key_2': 'Data_2', 'Key_1': 'Data_1'} 
True 

を、順番はdictため無意味です。

質問は最後のキーnを正確に意味していますか?最後に挿入された?または、最大のkey_%インデックス%を使用していますか?前に説明したように、最初のケースではOrderedDictを使用する方がよい。

ただし、ここに私の解決策があります。

def AddNextKey(Dict, NewData): 
    Dict['Key_%d' % (len(Dict) + 1)] = NewData 

d = {} 
AddNextKey(d, 'Data_1') 
AddNextKey(d, 'Data_2') 
AddNextKey(d, 'Data_3') 

print d 

あなたは

{'Key_1': 'Data_1', 'Key_3': 'Data_3', 'Key_2': 'Data_2'} 
+0

はい、sth。このように私は探していた。 – Rickson

1

あなたは、私はそれがほとんどのPython的なソリューションですかはわからないが、私のアプローチはdictをサブクラス化している追加のメソッドを追加することです

Dict = dict() 
for i in range(10): 
    Dict['key_' + str(len(Dict)+1)] = 'value_'+str(len(Dict)+1) 
print Dict 

出力

{'key_10': 'value_10', 'key_5': 'value_5', 'key_4': 'value_4', 'key_7': 'value_7', 'key_6': 'value_6', 'key_1': 'value_1', 'key_3': 'value_3', 'key_2': 'value_2', 'key_9': 'value_9', 'key_8': 'value_8'} 
2

辞書の長さを使用することができます。それはサブクラスですので、あなたはどこでもあなたが実際dictは、だけでなく、必要に応じてこれらの特別な操作を行うことができNextKeyDictのインスタンスを使用することができます。

class NextKeyDict(dict): 
    def add_next_key(self, new_data): 
     if not self.keys(): 
      self[0] = new_data 
      return 

     last_key = sorted(self.keys())[-1] 
     new_key = last_key + 1 
     self[new_key] = new_data 

d = NextKeyDict() 
d.add_next_key('foo') 
d.add_next_key('bar') 
d.add_next_key('baz') 
print(d) 

出力

{0: 'foo', 1: 'bar', 2: 'baz'} 
+0

ここでは、ユーザーが間違った形式でキーを挿入できないようにしています... –

+0

@RolandSmith Right。 Pythonは「同意する大人」の言語ですが、そうですか?私の考えは、このクラス/メソッドが整数キーでの使用にのみ適していることを説明する適切なドキュメントを持っていることを保証することです。あなたはどのような変更を行いますか? – Tagc

+0

不適切なキーを挿入できないように、いくつかのメソッドをオーバーライドします。賢明ではなく、ソリューションを堅牢にする。間違いを捕まえてバグに陥るもっと特殊なルール( "dict Xのすべてのキーは" Key_N "という形式でなければなりません)のコードは、プログラマが心に留めておく必要があるほどです。 –

0
# set-up the dictionary for demo purposes 
testdict = {x:y for x,y in zip(["Key_"+str(x) for x in range(1,7)], 
           ["Data_"+str(x) for x in range(1,7)])} 

# fetch most recent key 
# add 1 to recent_key_val and insert new value 
if len(testdict) != 0: 
    recent_key_val = max([int(x.split("_")[1]) for x in testdict]) 
    testdict["Key_"+str(recent_key_val +1)] = "New_Data" 
else: 
    testdict["Key_1"] = "New_Data" 
0

あなたが必要なものは、すでにPythonのに組み込まれています。だから、私は最もpythonic方法はOrderedDictを使用することだと思う。 docsとして は、通常の辞書メソッドをサポートし、

戻りdictのサブクラスのインスタンスを言います。 OrderedDictは、キーが最初に挿入された順序を記憶する辞書です。新しいエントリが既存のエントリを上書きする場合、元の挿入位置は変更されません。エントリを削除して再び挿入すると、最後まで移動します。定義により

from collections import OrderedDict 
d = OrderedDict() 
d["Key1"] = 1 
d["Key2"] = 2 
d["Key3"] = 3 

last_key = d.keys()[-1] # "Key3" thanks to ordering 
new_key = calculate_new_key(last_key) 
d[new_key] = new_value 
0

、Pythonの辞書のキーの順不同のセットです:キーは一意である要件で、値のペア。 クラスコレクションからOrderedDictを使用して辞書を作成および更新し、注文を保存することができます。

from collections import OrderedDict 
d1 = OrderedDict([(1, 'Data_1'), (2, 'Data_2'),(3, 'Data_3')]) 

はあなたが

AddNextKey(d1, 'Blah') 

あなたは

012を取得する呼び出す辞書

def AddNextKey(Dict, NewData): 
    last_key = next(reversed(Dict)) 
    new_key = last_key + 1 
    Dict.update({new_key: NewData}) 

に更新するために、今すぐ

​​

方法を取得します

OrderedDict([(1, 'Data_1'), (2, 'Data_2'), (3, 'Data_3'), (4, 'Blah')]) 
1

通常のPythonの辞書は順序付けられていないでしょう。技術的には、「最後」のキーはありません。

しかし、その周りに道があります。 lenメソッドを使用して、ディクショナリ内にある項目の数を確認し、それに基づいて次のキーを構築することができます。

ただし、このメソッドはが壊れていますです。誤ってキー 'foo'を辞書に追加すると、スキーム全体がオフになります。

修正本当にこれは、あなたはそれが唯一のフォーム'Key_N'で有効なキーを受け入れるように(this answerに示すように__setitem__updateメソッドをオーバーライドすることによって)dictのサブクラスを作成する必要があります。 appendメソッドを追加して、次のキーを自動的に作成することもできます。

しかし、turbulencetooがコメントしたように、おそらくリストを使う方が簡単でしょう。

関連する問題