ovntatar
ovntatar

Reputation: 416

comparing only two values in dictionary

I try to find a solution to find out what items are double in the dict by comparing only 2 values. In my case "key" and "Cell". The sequence should be first the values should be compared in key and after the values in Cell.

the source dict

{
1: {    Name: 'item1', Cell: 'DC01', key: 'R12'  }, 
2: {    Name: 'item2', Cell: 'DC02', key: 'R12'  }, 
3: {    Name: 'item3', Cell: 'DC03', key: 'R13'  }, 
4: {    Name: 'item4', Cell: 'DC02', key: 'R12'  }, 
5: {    Name: 'item5', Cell: 'DC05', key: 'R15'  }  
}

the output should be:

{
1: {    Name: 'item1', Cell: 'DC01', key: 'R12', answ :  'false' }, 
2: {    Name: 'item2', Cell: 'DC02', key: 'R12'  answ :  'true' }, 
3: {    Name: 'item3', Cell: 'DC03', key: 'R13'  answ :  'false' }, 
4: {    Name: 'item4', Cell: 'DC02', key: 'R12'  answ :  'true' }, 
5: {    Name: 'item5', Cell: 'DC05', key: 'R15'  answ :  'false' }  
}

The question is what are the best way also from performance perspective.

Upvotes: 0

Views: 30

Answers (2)

leaf_soba
leaf_soba

Reputation: 2518

code:

x = {\
1: {    "Name": 'item1', "Cell": 'DC01', "key": 'R12'  },\
2: {    "Name": 'item2', "Cell": 'DC02', "key": 'R12'  },\
3: {    "Name": 'item3', "Cell": 'DC03', "key": 'R13'  },\
4: {    "Name": 'item4', "Cell": 'DC02', "key": 'R12'  },\
5: {    "Name": 'item5', "Cell": 'DC05', "key": 'R15'  }  
}
result = {}
key_set = set()
cell_set = set()
i = 0
for _,item in x.items():
    if item["key"] in key_set or item["Cell"] in cell_set:
        item.update({"answ":"true"})
    else:
        item.update({"answ":"false"})
    i+=1
    result.update({i:item})
    key_set.add(item["key"])
    cell_set.add(item["Cell"])
print(result)

result:

{
1: {'Name': 'item1', 'Cell': 'DC01', 'key': 'R12', 'answ': 'false'}, 
2: {'Name': 'item2', 'Cell': 'DC02', 'key': 'R12', 'answ': 'true'}, 
3: {'Name': 'item3', 'Cell': 'DC03', 'key': 'R13', 'answ': 'false'}, 
4: {'Name': 'item4', 'Cell': 'DC02', 'key': 'R12', 'answ': 'true'}, 
5: {'Name': 'item5', 'Cell': 'DC05', 'key': 'R15', 'answ': 'false'}
}

Upvotes: 1

Andrej Kesely
Andrej Kesely

Reputation: 195543

If I understand you correctly, you want to find duplicates in your dictionary ("Cell", "key"):

dct = {
    1: {"Name": "item1", "Cell": "DC01", "key": "R12"},
    2: {"Name": "item2", "Cell": "DC02", "key": "R12"},
    3: {"Name": "item3", "Cell": "DC03", "key": "R13"},
    4: {"Name": "item4", "Cell": "DC02", "key": "R12"},
    5: {"Name": "item5", "Cell": "DC05", "key": "R15"},
}


seen = {}
for d in dct.values():
    seen.setdefault((d["Cell"], d["key"]), 0)
    seen[(d["Cell"], d["key"])] += 1

for d in dct.values():
    d["answer"] = seen[(d["Cell"], d["key"])] > 1

print(dct)

Prints:

{
    1: {"Name": "item1", "Cell": "DC01", "key": "R12", "answer": False},
    2: {"Name": "item2", "Cell": "DC02", "key": "R12", "answer": True},
    3: {"Name": "item3", "Cell": "DC03", "key": "R13", "answer": False},
    4: {"Name": "item4", "Cell": "DC02", "key": "R12", "answer": True},
    5: {"Name": "item5", "Cell": "DC05", "key": "R15", "answer": False},
}

Upvotes: 1

Related Questions