I’m struggling with understanding how the <= operator works.
I have one list with one dictionary element (just one element) called result:
dict_items([('AGATC', '4'), ('AATG', '1'), ('TATC', '5')])
I also have list of dictionary elements (more than one) called data:
dict_items([('name', 'Alice'), ('AGATC', '2'), ('AATG', '8'), ('TATC', '3')])
dict_items([('name', 'Bob'), ('AGATC', '4'), ('AATG', '1'), ('TATC', '5')])
dict_items([('name', 'Charlie'), ('AGATC', '3'), ('AATG', '2'), ('TATC', '5')])
Code that is problematic is here:
# Check if any person in csv file matches output from dna_count
for row in data:
if result.items() <= row.items():
print(row["name"])
I understand that it checks if any row of data matches element of result, and if it does then it prints name from that row, but why operator == isn’t working there and I need to use <=, and how does <= behave because in result there is no name key, does it skip name key?
>Solution :
Keys views are set-like since their entries are unique and hashable. If all values are hashable, so that
(key, value)pairs are unique and hashable, then the items view is also set-like. [..] For set-like views, all of the operations defined for the abstract base classcollections.abc.Setare available (for example,==,<, or^).
So, you can use set comparison operators here, and result.items() <= row.items() tests if result.items() is a subset of row.items(). Subset means that it contains some items but not any other items.
Which is obviously what makes this comparison true:
dict_items([('AGATC', '4'), ('AATG', '1'), ('TATC', '5')]) dict_items([('name', 'Bob'), ('AGATC', '4'), ('AATG', '1'), ('TATC', '5')])
The first "set" here is a subset of the second, but it’s not equal (because it’s missing one item).