3

それらの値に基づいて、辞書を使用するすべての可能な方法を生成したいと思います。コードで説明するには、次のものがあります。

a = {'name' : 'a', 'items': 3}
b = {'name' : 'b', 'items': 4}
c = {'name' : 'c', 'items': 5}

これらの辞書から正確に 7 項目を (たとえば) 選択できるようにしたいと考えています。

そう:

x = itertools.product(range(a['items']), range(b['items']), range(c['items']))
y = itertools.ifilter(lambda i: sum(i)==7, x)

私に与えるだろう:

(0, 3, 4)
(1, 2, 4)
(1, 3, 3)
...

私が本当に欲しいのは:

({'name' : 'a', 'picked': 0}, {'name': 'b', 'picked': 3}, {'name': 'c', 'picked': 4})
({'name' : 'a', 'picked': 1}, {'name': 'b', 'picked': 2}, {'name': 'c', 'picked': 4})
({'name' : 'a', 'picked': 1}, {'name': 'b', 'picked': 3}, {'name': 'c', 'picked': 3})
....

これをきれいに行う方法についてのアイデアはありますか?

4

2 に答える 2

0

ここにあります

import itertools
import operator

a = {'name' : 'a', 'items': 3}
b = {'name' : 'b', 'items': 4}
c = {'name' : 'c', 'items': 5}

dcts = [a,b,c]

x = itertools.product(range(a['items']), range(b['items']), range(c['items']))
y = itertools.ifilter(lambda i: sum(i)==7, x)
z = (tuple([[dct, operator.setitem(dct, 'picked', vval)][0] \
       for dct,vval in zip(dcts, val)]) for val in y)
for zz in z:
    print zz

これを変更して、辞書のコピーを作成できます。反復ごとに新しい dict インスタンスが必要な場合は、z行を次のように変更できます

z = (tuple([[dct, operator.setitem(dct, 'picked', vval)][0] \
      for dct,vval in zip(map(dict,dcts), val)]) for val in y)
于 2012-11-14T16:34:33.723 に答える
0

簡単な方法は、新しい辞書を生成することです:

names = [x['name'] for x in  [a,b,c]]
ziped = map(lambda x: zip(names, x), y)
maped = map(lambda el: [{'name': name, 'picked': count} for name, count in el],
            ziped) 
于 2012-11-14T16:44:49.983 に答える