2015-01-01 13 views
6

Iterating over dict values - この質問に関連する:複数の値検索

def bla(self,x,y) 
    for i in self.DataBase.keys(): 
     for x,y in self.DataBase[i]: 
      if x == dept and y == year: 
       return self.DataBase[i] 

これは私が鍵を取り、キーにn個の値を検索するにはどのように私が達成しようとしているという考え、より多くのです値がキーに含まれている場合はキーを返します

+0

ているので、私は仮定のPython 3、のためにすべての作業次

def bla(self,x,y): found = {key for key, (x, y) in self.DataBase.items() if x==dept and y==year} found = ''.join(num) #joins set into string return found 

は、あなたが望むものであるuが、PPL =コース(123 – Hackaholic

+0

ウル入力されたデータを表示することができます「プログラミング言語の原則」 os =コース(133、 'オペレーティングシステム') db = DB) db.setCourse(ppl、 'SE'、2,1) db.setCourse(os、 'SE' 、3,1) –

+0

コメントには表示されないので、質問にコードを入れてください( 'edit'を使用してください)。私の最高のexplaneするためにいくつかの理由で –

答えて

3

、xおよびyは、キーに対応する、それぞれ、(どんな長さの)組の第一及び第二の要素、一致する場合は、データベースキーを返すbla方法について以下

def bla(self, x, y) 
    for key, value in self.DataBase.iteritems(): 
     if (x, y) == value[:2]: 
      return key 

および、データベースキーを返すbla方法は、タプルがあるデータベースの値は、xとyの両方が含まれている場合:

def bla(self, x, y) 
    for key, value in self.DataBase.iteritems(): 
     if x in value and y in value: 
      return key 
+1

iteritems()がpython 3から削除されていませんか?私はitems()があなたが望むものだと思う。私の答えを見てください。 – Bolboa

+0

はい、のpython3のために、あなたは、単にすべての機能を失うことなく.itemsと.iteritemsを()()交換してください。 – dopstar

2

質問で「キーを返す」と言ったので、実際に検索パラメータの一部と一致する値を持つ辞書をキーで隔離したいとしますあなたが投稿したコードフラグメントは、キーではなく値を返します)。その値はxとyのどこタプルの両方が返されます含まれてい

def getMatchingKeys(self, x, y): 
    '''Extract keys whose values contain x and y (position does not matter)''' 
    return [i for i in self.Database if x in self.Database[i] and y in self.Database[i]] 

キー:self.Databaseは辞書であると仮定すると、次のようなもので、リストの内包表記としてキーを抽出することもできます。タプル内の特定の位置に一致させる必要がある場合は、理解の中の条件をif x == self.Database[i][1] and y == self.Database[i][2]のように変更することができます。

キーの後ろにいない場合は、質問を明確にしてください。以下

+0

病気の試みは、私が自己、Xを取得し、FUNCを持って、それを行うために必要なものyはxのデータベース(辞書データベース)は、各キーに検索することで、データベース内のxおよびyならY [キー]私はthatsのがより理解期待とタプルがサイズ2、よりあり、それらは4であるか、またはキーでn値を検索するために、より一層acurrateするキーを返します。 –

+0

@ Mike.Gそれは少し明確にするのに役立ちます - 私はそれに応じて私の答えを編集しました。答えで言及したように、正確な実装は、タプル内のどこでもxとyを検索するかどうか、または特定の位置を探しているかどうかによって異なります。 – rchang

+0

私は、値が正確であるという特定の位置にあると、各キーの入力順序が同じであると考えています。私は値を保持しているキーを意味します。その値は、常に各値の同じ位置になります。 –

1

あなたは内蔵map()設定するために使用することができるがxy変数。

def bla(self,x,y) : 
    for key in self.DataBase : 
     x,y = map(float, self.DataBase[key]) 
     if x == dept and y == year: 
      return key 

あなたがitems()を使用したい場合は、あなたが(等しく有効)だけでなく、次の操作を行いことがあります。

ここ
def bla(self,x,y): 
    for key, val in self.DataBase.items(): 
     x, y = map(float, val) 
     if x == dept and y == year: 
      return key 

map()せずにそれを行うためのさらに別の方法ですが、これはあなたに開梱の利点を提供しますタプル辞書を反復処理しながら、:

def bla(self,x,y): 
    for key, (x, y) in self.DataBase.items(): 
     if x == dept and y == year: 
      return key 

を私が言うものの、あなたはまた、リストの内包表記を使用して、ように上記を書き込むことができます。上記のものが好ましい:あなたのタグのいずれかがPython 3.x

+1

'map'は' bla'メソッドがその引数をfloatに型変換する理由がないので不要です。前提があるのでself.DataBase values.Thereも解凍エラーの脆弱性であるそれらを与える再割り当てステップによって陰にされているy'すべてのコードスニペット、引数 'X'で と 'そのself.DataBase値正確に長さ2のタプルまたはリストになります(OPはそのケースを述べています)。 私は 'depth'と' year'は、引数ではないグローバルであることを意味していたと思います。さもなければ、 'bla'メソッドのシグネチャの引数は必要ありません。 – dopstar