Home > Mobile >  How to check the values in two dictionaries have the same type?
How to check the values in two dictionaries have the same type?

Time:07-01

For example, I have two dictionaries having the same keys:

a = {"a": 1, "b": 2, "c":4.5, "d":[1,2], "e":"string", "f":{"f1":0.0, "f2":1.5}}
b = {"a": 10, "b": 20, "c":3.5, "d":[0,2,4], "e":"q", "f":{"f1":1.0, "f2":0.0}}

and I want to compare the types. My code is something like this:

if type(a["a"]) ==  type(b["a"]) and type(a["b"]) == type(b["b"]) and type(a["c"]) == type(b["c"]) and type(a["d"]) == type(b["d"]) and type(a["e"]) == type(b["e"]) and type(a["f"]) == type(b["f"]) and type(a["f"]["f1"]) == type(b["f"]["f1"]) and type(a["f"]["f2"]) == type(b["f"]["f2"]):
    first_type = type(b["d"][0])
    if all( (type(x) is first_type) for x in a["d"] )
       #do something
       pass

Is there a better way to do it?

CodePudding user response:

You can make a list of the common keys between the dicts:

common_keys = a.keys() & b.keys()

and then iterate over them to check the types:

for k in common_keys:
    if type(a[k]) == type(b[k]):
        print("Yes, same type! "   k, a[k], b[k])
    else: 
        print("Nope! "   k, a[k], b[k])

and if you wanted to go deeper, check if any of the items are dicts, rinse an repeat

for k in common_keys:

    if type(a[k]) == type(b[k]):
        print("Yes, same type! "   k, type(a[k]), type(b[k]))
        if isinstance(a[k], dict): 
            ck = a[k].keys() & b[k].keys()
            for key in ck:
                if type(a[k][key]) == type(b[k][key]):
                    print("Yes, same type! "   key, type(a[k][key]), type(b[k][key]))
                else: 
                    print("Nope!")
    else: 
        print("Nope! "   k, type(a[k]), type(b[k]))

CodePudding user response:

You can use a for loop to iterate through the dicts:

same_types = True
for key in a.keys():
    if type(a[key]) != type(b[key]):
        same_types = False
        break
    # if the value is a dict, check nested value types
    if type(a[key]) == dict:
        for nest_key in a[key].keys():
            if type(a[key][nest_key]) != type(b[key][nest_key]):
                same_types = False
                break
    # if the value is a list, check all list elements
    # I just simply concat two lists together, you can also refer to 
    # https://stackoverflow.com/q/35554208/19322223
    elif type(a[key]) == list:
        first_type = a[key][0]
        for elem in a[key]   b[key]:
            if type(elem) != first_type:
                same_types = False
                break
    if not same_types:
        break

if same_types:
    # do something
  • Related