2016-03-30 13 views
5

それぞれのオブジェクトをそれぞれと比較するにはどうすればいいですか?ratio()> 0.7なら両方のオブジェクトに対してpossible_duplicate=Trueを設定しますか?どのように各オブジェクトをそれぞれと比較できますか?

私の試み:

from difflib import SequenceMatcher 


class Item(models.Model): 
    name = models.CharField(max_length=255) 
    desc = models.TextField() 
    possible_duplicate = models.BooleanField(default=False) 



items = Item.objects.all() 

for item in items: 
    obj = Item.objects.get(pk=item.pk) 
    similarity = SequenceMatcher(None, item.desc, obj.desc).ratio() 
    if similarity > 0.7: 
     item.possible_duplicate = True 
     item.save() 
     obj.possible_duplicate = True 
     obj.save() 

答えて

5

あなたは比較の組み合わせを取得するためにitertools.combinationsを使用することができます:あなたのコードで

>>> import itertools 
>>> items = [1, 2, 3] 
>>> itertools.combinations(items, 2) # 2 -> yields tuples with 2 items 
<itertools.combinations object at 0x7f5e456d5ba8> 
>>> list(itertools.combinations(items, 2)) 
[(1, 2), (1, 3), (2, 3)] 

import itertools 

items = Item.objects.all() 

for item1, item2 in itertools.combinations(items, 2): 
    similarity = SequenceMatcher(None, item1.desc, item2.desc).ratio() 
    if similarity > 0.7: 
     for item in item1, item2: 
      item.possible_duplicate = True 
      item.save() 
2

あなたが自分自身にオブジェクトを比較しています。すべてのオブジェクトを互いに比較するにはitertools.combinations

items_list = list(Items.objects.all()) 

for a,b in itertools.combinations(items_list, 2): 
    similarity = SequenceMatcher(None, a.desc, b.desc).ratio() 
    if similarity > 0.7: 
     a.possible.duplicate = True 
     a.save() 
     b.possible.duplicate = True 
     b.save() 
+1

なぜ 'Items.objects.all()'をリストに変換するのですか? – styvane

+0

おそらく必要ではない、 'itertools.combinations'がquerysetsを扱うことができるかどうかは分かりませんでした。 – ilse2005

+1

'itertools.combinations'への最初の引数は' iterable'でなければならず、querysetはiterableなので、リストに変換する必要はありません。 – styvane

関連する問題