2016-03-30 6 views
5

मैं प्रत्येक वस्तु के साथ प्रत्येक ऑब्जेक्ट की तुलना कैसे कर सकता हूं और यदि अनुपात()> 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

क्यों 'आइटम्स.बोजेक्ट्स .all() 'को किसी सूची में परिवर्तित कर सकते हैं? – styvane

+0

शायद आवश्यक नहीं है, मुझे बस यकीन नहीं था कि 'itertools.combinations' क्वेरीसेट को संभाल सकता है या नहीं। – ilse2005

+1

'itertools.combinations' के लिए पहला तर्क एक 'पुन: प्रयोज्य' होना चाहिए और क्वेरीसेट पुनरावर्तनीय है इस प्रकार आपको इसे किसी सूची में बदलने की आवश्यकता नहीं है। – styvane

संबंधित मुद्दे