Search code examples
pythondictionaryunordered

python dictionary (unordered selections key)


I have a question about dic.has_key

my code is

def insertToDic(dic,comSick):
    for datum in comSick :
            if dic.has_key(datum):
                    dic[datum]+=1
            else :
                    dic[datum] =1

if comSick is

comSick=[(A,B),(A,C),(B,A)]

dic will be

dic = {(A,B) : 1, (A,C) : 1, (B,A) : 1}

but what I want is unordered key (which means (A,B) = (B,A))

dic = {(A,B) : 2, (A,C) : 1}  <-- this is what I want

what should I do?


Solution

  • Try this:

    def insertToDic(dic,comSick):
        for datum in comSick :
            sorted_datum = tuple(sorted(datum))
            dic[sorted_datum] = dic.get(sorted_datum, 0) + 1
    
    comSick=[('A', 'B'), ('A', 'C'), ('B', 'A')]
    
    dic = {}
    insertToDic(dic, comSick)
    print(dic)
    

    I made some changes. I sorted the datum before updating the dictionary. This ensures that one of (A,B) and (B,A) will be changed to the other. It is not clear what A and B are, so B may be lower than A. Did you mean the strings 'A' and 'B'? That's what I used.

    I also changed how you increment the value. The get() method will return the current value if it exists or the given default value if it doesn't--in this case, zero.

    Also note that the final dictionary has no inherent order, so you may get the answer {('A', 'C'): 1, ('A', 'B'): 2}, which is what I got in my Python 3.5.2 in Anaconda.