0

Python 辞書をそれ自体と比較したいと思います。例えば:

for key1 in d:
    for key2 in d:
        if key1 == key2:
            continue
        compare(d[key1],d[key2])

上記は、key1 を key 2 と比較し、後でその逆 (key2 と key1) を比較する場合を除いて機能します。2 番目の for ループの範囲は、比較の繰り返しを避けるために、実際には key1 の後に開始する必要があります。どうすればそれができますか?

4

4 に答える 4

3

itertools.combinationsここは参考になると思います

>>> import itertools
>>> d = dict.fromkeys(range(5),0)
>>> list(itertools.combinations(d,2))
[(0, 1), (0, 2), (0, 3), (0, 4), (1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]

したがって、あなたの場合は、次のようにします。

for key1,key2 in itertools.combinations(d,2):
    compare(d[key1],d[key2])

これは、茶色の目(または髪の毛だと思います...)を持つ人々のペアのリストを作成するばかげた例です。

>>> d = dict.fromkeys(["Jon","Jane","Bob","Jim","Janice"],"blue")
>>> d["Jim"] = "Brown"
>>> d["Jane"] = "Brown"
>>> d["Bob"] = "Brown"
>>> [ (x,y) for (x,y) in itertools.combinations(d,2) if d[x]=="Brown" and d[y]=="Brown" ]
[('Jane', 'Bob'), ('Jane', 'Jim'), ('Bob', 'Jim')]
于 2013-01-15T19:31:18.133 に答える
1

実際には、辞書を参照するためのキーは必要ありません。@mgilson が提案したように、itertools.combinations を使用して、辞書の値を直接比較できます。

>>> from itertools import combinations
>>> d = {random.randint(1,100):i for i in range(10)}
>>> list(combinations(d.values(), 2))
[(7, 4), (7, 2), (7, 3), (7, 1), (7, 0), (7, 8), (7, 9), (7, 5), (7, 6), (4, 2), (4, 3), (4, 1), (4, 0), (4, 8), (4, 9), (4, 5), (4, 6), (2, 3), (2, 1), (2, 0), (2, 8), (2, 9), (2, 5), (2, 6), (3, 1), (3, 0), (3, 8), (3, 9), (3, 5), (3, 6), (1, 0), (1, 8), (1, 9), (1, 5), (1, 6), (0, 8), (0, 9), (0, 5), (0, 6), (8, 9), (8, 5), (8, 6), (9, 5), (9, 6), (5, 6)]
>>> 
于 2013-01-15T19:55:43.100 に答える
0

ネストされたforループに固執したい場合は、次の方法でうまくいきます。

d = dict(a=1,b=2,c=3,d=4)
k = d.keys()
l = len(k)

for i in range(l):
    for j in range(i+1,l):
        print d[k[i]] == d[k[j]]
于 2013-01-15T20:05:23.917 に答える