1

dict1特定の値がの特定の値と一致する場合に2つの辞書の値を生成する関数をPythonで構築しようとしていますdict2。私の関数は次のようになります。

def dict_matcher(dict1, dict2, item1_pos, item2_pos):
"""Uses a tuple value from dict1 to search for a matching tuple value in dict2. If a match is found, the other values from dict1 and dict2 are returned."""
for item1 in dict1:
    for item2 in dict2:
        if dict1[item1][item1_pos] == dict2[item2][item2_pos]:
            yield(dict1[item1][2], dict2[item2][6])

私はdict_matcherこのように使用しています:

matches = [myresults for myresults in dict_matcher(dict1, dict2 , 2, 6)]
print(matches)

印刷するmatchesと、次のように正しく一致するdict1とdict2の値のリストが表示されます。

[('frog', 'frog'), ('spider', 'spider'), ('cricket', 'cricket'), ('hampster', 'hampster')]

この関数に変数引数を追加して、各ディクショナリから一致する値を出力するだけでなく、一致するインスタンスで各ディクショナリアイテムの他の値も出力できるようにするにはどうすればよいdict1[item1][2] and dict2[item2][6]ですか?* argsを使用できますか?助けてくれてありがとう。

編集:わかりました、私がやろうとしていることに関していくつかの混乱があるようですので、別の例を試してみましょう。

dict1 = {1: ('frog', 'green'), 2: ('spider', 'blue'), 3: ('cricket', 'red')}

dict2 = {a: ('frog', 12.34), b: ('ape', 22.33), c: ('lemur', 90.21)}

dict_matcher(dict1, dict2, 0, 0)dict1のvalue[0]とdict2のvalue[0]に一致する値が見つかります。この場合、一致するのは「カエル」だけです。上記の私の関数はこれを行います。私がやろうとしているのはdict1[value][0] == dict2[value][0]、関数の引数で指定したい辞書項目から他の値を出力できるように関数を拡張することです。

4

3 に答える 3

1

スライスオブジェクトを使用できます:

def dict_matcher(dict1, dict2, pos1, pos2, slicer1=(), slicer2=()):
    slice1 = slice(*slicer1) if slicer1 else slice(len(dict1))
    slice2 = slice(*slicer2) if slicer2 else slice(len(dict2))
    for data1 in dict1.values():
        for data2 in dict2.values():
            if data1[pos1] == data2[pos2]:
                yield data1[slice1], data2[slice2]

for result1, result2 in dict_matcher(my_dict, your_dict, 2, 6, (3, 8, 2), (2, 6)):
    print result1, result2
  • some_list[slice(3, 8, 2)]はと同等であり、4番目の要素(インデックス3)から8番目の要素までのsome_list[3:8:2]2つおきの要素を提供します。some_list
  • some_list[slice(2, 6)]はと同等であり、3番目の要素(インデックス2を持つ)から6番目の要素までのsome_list[2:6]すべての要素を提供します。some_list
  • some_list[slice(7)]と同等であり、7番目までのsome_list[:7]要素のすべての要素を提供しますsome_list

引数を省略するslicer1/2と、関数はリスト全体が必要であると想定し、それに応じてスライスが設定されます。

また、不要な辞書検索を削除しました。

于 2011-08-11T01:47:20.160 に答える
0

あなたはそれを次のように呼んでいると言いました

matches = [myresults for myresults in dict_matcher(dict1, dict2 , 2, 6)]

あなたはそれを次のように呼ぶべきです

matches = list(dict_matcher(dict1, dict2 , 2, 6))

そしてそれの署名は

def dict_matcher(dict1, dict2, item1_pos, item2_pos, *args):

したがって、4つの引数が渡され、4つの名前付き引数が渡されます。したがって*args、結果はargs = None

何が欲しいのか正確にはわかりませんが、

yield dict1[item1][item1_pos], dict2[item2][item2_pos]

あなたはあなたがすることから得るのと同じことを得るでしょう

yield dict1[item1][2], dict2[item2][6]

一致するアイテム全体を取得したい場合は、

yield dict1[item1], dict2[item2]

それぞれから1つのアイテムを取得したいが、一致するアイテムは取得したくない場合は、

def dict_matcher(dict1, dict2, item1_pos, item2_pos, other1_pos, other2_pos):

yield dict1[item1][other1_pos], dict2[item2][other2_pos]

matches = list(dict_matcher(dict1, dict2 , 2, 6, 3, 8)) 

または3と8の代わりに何でも。

すべてではありませんが、いくつかのアイテムを取得したい場合は、

def dict_matcher(dict1, dict2, item1_pos, item2_pos, other1_poss, other2_poss):

yield [dict1[item1][i] for i in other1_poss], [dict2[item2][i] for i in other2_poss]

matches = list(dict_matcher(dict1, dict2 , 2, 6, (2, 3), (6, 8))) 

または[2、3]と[3、8]の代わりに。

これがあなたの意図したことではない場合は、私に知らせてください。

于 2011-08-11T01:46:47.103 に答える
0

一致を比較するために、任意の数のインデックスのペアを指定しようとしていますか?

このようなもの?

def matcher(d1, d2, *args):
    indexes = zip(args[0::2], args[1::2])
    for a, b in indexes:
        for value1 in dict1.values():
            for value2 in dict2.values():
                x, y = value1[a], value2[b]
                    if x == y:
                        yield x, y

dict1 = {1: ('frog', 'green'), 2: ('spider', 'blue'), 3: ('cricket', 'red')}
dict2 = {a: ('frog', 12.34), b: ('ape', 22.33), c: ('lemur', 90.21)}

matches = list(matcher(d1, d2, 
                        0, 0, # first pair to search for matches
                        1, 1  # second pair, 
                        # ... and so on,
))

print matches
# [('frog', 'frog')]

これはひどく使えるとは思いませんが、これでうまくいくでしょう。スライスの魔法のために奇数の引数を指定した場合でも、これは一種の作業になります。ただし、このため、マッチャー関数へのインターフェイスは誤って使用しやすくなります。

私はもっ​​と次のようなものを強く考えたいと思います:

def matcher(d1, d2, indexes_to_check):
    ...
print list(matcher(d1, d2, [(0, 0), (1, 1), ...]))

def matcher(d1, d2, *indexes_to_check):
    ...
print list(matcher(d1, d2, (0, 0), (1, 1)))
于 2011-08-11T04:07:18.503 に答える