2012-07-30 9 views
9

के बराबर है या नहीं, मैं कई ऑब्जेक्ट्स की तुलना करना चाहता हूं और केवल True लौटा सकता हूं यदि सभी ऑब्जेक्ट्स स्वयं के बीच समान नहीं हैं। मैंने नीचे दिए गए कोड का उपयोग करने की कोशिश की, लेकिन यह काम नहीं करता है। यदि obj1 और obj3 बराबर हैं और obj2 और obj3 बराबर नहीं हैं, तो परिणाम True है।पायथन: यह निर्धारित करना कि अनुक्रम में कोई भी आइटम किसी अन्य

obj1 != obj2 != obj3 

मेरे पास तुलना करने के लिए 3 से अधिक ऑब्जेक्ट्स हैं। नीचे दिए गए कोड का उपयोग करते हुए सवाल से बाहर है:

all([obj1 != obj2, obj1 != obj3, obj2 != obj3]) 
+0

वस्तुओं की संख्या तय की, या चर है? क्या वे एक सरणी के तत्व हैं, या अलग-अलग चर में हैं? –

उत्तर

20

@ माइकल हॉफमैन का जवाब अच्छा है अगर ऑब्जेक्ट्स सभी हैंशबल हैं। यदि नहीं, तो आप itertools.combinations उपयोग कर सकते हैं:

>>> all(a != b for a, b in itertools.combinations(['a', 'b', 'c', 'd', 'a'], 2)) 
False 
>>> all(a != b for a, b in itertools.combinations(['a', 'b', 'c', 'd'], 2)) 
True 
18

वस्तुओं सभी hashable रहे हैं, तो आप देख सकते हैं वस्तुओं के अनुक्रम का एक frozenset अनुक्रम ही लम्बाई समान होती है या नहीं:

def all_different(objs): 
    return len(frozenset(objs)) == len(objs) 

उदाहरण:

>>> all_different([3, 4, 5]) 
True 
>>> all_different([3, 4, 5, 3]) 
False 
+0

अरे! मुझे 10 सेकंड से हराया। – inspectorG4dget

+1

ध्यान दें कि ऑब्जेक्ट्स अस्थिर होने पर यह काम नहीं करेगा। – BrenBarn

+0

यह काम नहीं करता है यदि ऑब्जेक्ट्स में से एक (या सभी) एक अस्थिर है (उदा। एक सूची) – mgilson

3

आप देख सकते हैं कि किसी सूची में आइटम के सभी यह एक सेट के लिए परिवर्तित करके अद्वितीय हैं।

my_obs = [obj1, obj2, obj3] 
all_not_equal = len(set(my_obs)) == len(my_obs) 
4
from itertools import combinations 
all(x != y for x, y in combinations(objs, 2)) 
+1

वह ओ (एन^2) तुलना - बड़ी सूचियों के लिए एक बहुत कम है। – inspectorG4dget

6

वस्तुओं unhashable लेकिन orderable (उदाहरण के लिए, सूची) हैं तो आप हे से itertools समाधान बदल सकता है (एन^2) हे करने के लिए (एन लॉग एन) छँटाई के द्वारा:

def all_different(*objs): 
    s = sorted(objs) 
    return all(x != y for x, y in zip(s[:-1], s[1:])) 

यहाँ एक पूर्ण कार्यान्वयन है:

def all_different(*objs): 
    try: 
     return len(frozenset(objs)) == len(objs) 
    except TypeError: 
     try: 
      s = sorted(objs) 
      return all(x != y for x, y in zip(s[:-1], s[1:])) 
     except TypeError: 
      return all(x != y for x, y in itertools.combinations(objs, 2)) 
+0

हैशबिलिटी की जांच बहुत जटिल है (और थोड़ा गलत भी)। पाइथन में ऐसा करने का बेवकूफ तरीका यह है कि अगर यह विफल हो जाता है तो 'फ्रोजनसेट()' बनाने और 'TypeError' पकड़ने का प्रयास करें। (परीक्षण थोड़ा गलत है क्योंकि 'isinstance (obj, संग्रह। हैशबल) 'सत्य' होने की गारंटी नहीं है कि ऑब्जेक्ट वास्तव में हैशबल है। यह केवल जांचता है कि ऑब्जेक्ट में एक प्रकार है जो इसे सिद्धांत रूप से धोने की अनुमति देता है। ([],) 'काउंटर उदाहरण के रूप में।) –

+0

@ स्वेनमार्कैच धन्यवाद, तय। – ecatmur

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