I have to write a function find_first_read
in order to find the particular Read-key in the dictionary of dictionaries, that contain values less than 2
desired output
find_first_read(some_dict)
'Read4'
What should I change in my code below to get the desired output:
some_dict = {'Read1': {'Read3': 0, 'Read2': 1, 'Read5': 1, 'Read4': 0, 'Read6': 29},
'Read3': {'Read1': 0, 'Read2': 0, 'Read5': 0, 'Read4': 1, 'Read6': 1},
'Read2': {'Read1': 13, 'Read3': 1, 'Read5': 21, 'Read4': 0, 'Read6': 0},
'Read5': {'Read1': 39, 'Read3': 0, 'Read2': 1, 'Read4': 0, 'Read6': 14},
'Read4': {'Read1': 1, 'Read3': 1, 'Read2': 17, 'Read5': 2, 'Read6': 0},
'Read6': {'Read1': 0, 'Read3': 43, 'Read2': 0, 'Read5': 0, 'Read4': 1}}
def find_first_read(some_dict):
positions = [] # output variable
min_value = 2
for k, v in some_dict.items():
if v < min_value:
positions.append(k)
return positions
CodePudding user response:
You are actually trying to compare your min_value to another dict. You have to add another loop to get the nested values. To make the output more clear, I return it as a list of keys instead of a single key to make up for the nesting.
some_dict = {'Read1': {'Read3': 0, 'Read2': 1, 'Read5': 1, 'Read4': 0, 'Read6': 29},
'Read3': {'Read1': 0, 'Read2': 0, 'Read5': 0, 'Read4': 1, 'Read6': 1},
'Read2': {'Read1': 13, 'Read3': 1, 'Read5': 21, 'Read4': 0, 'Read6': 0},
'Read5': {'Read1': 39, 'Read3': 0, 'Read2': 1, 'Read4': 0, 'Read6': 14},
'Read4': {'Read1': 1, 'Read3': 1, 'Read2': 17, 'Read5': 2, 'Read6': 0},
'Read6': {'Read1': 0, 'Read3': 43, 'Read2': 0, 'Read5': 0, 'Read4': 1}}
def find_first_read(some_dict):
positions = [] # output variable
min_value = 2
for k, v in some_dict.items():
for ki, vi in v.items():
if vi < min_value:
positions.append([k, ki])
return positions
print(find_first_read(some_dict))
output:
[['Read1', 'Read3'], ['Read1', 'Read2'], ['Read1', 'Read5'], ['Read1', 'Read4'],
['Read3', 'Read1'], ['Read3', 'Read2'], ['Read3', 'Read5'], ['Read3', 'Read4'],
['Read3', 'Read6'], ['Read2', 'Read3'], ['Read2', 'Read4'], ['Read2', 'Read6'],
['Read5', 'Read3'], ['Read5', 'Read2'], ['Read5', 'Read4'], ['Read4', 'Read1'],
['Read4', 'Read3'], ['Read4', 'Read6'], ['Read6', 'Read1'], ['Read6', 'Read2'],
['Read6', 'Read5'], ['Read6', 'Read4']]
CodePudding user response:
Use:
from collections import defaultdict
def find_first_read(data):
d = defaultdict(list)
for key, values in data.items():
for k, v in values.items():
d[k].append(v)
# for example the dictionary has the item "Read4", [0, 1, 0, 0, 1]
return next(k for k, vs in d.items() if all(v < 2 for v in vs))
some_dict = {'Read1': {'Read3': 0, 'Read2': 1, 'Read5': 1, 'Read4': 0, 'Read6': 29},
'Read3': {'Read1': 0, 'Read2': 0, 'Read5': 0, 'Read4': 1, 'Read6': 1},
'Read2': {'Read1': 13, 'Read3': 1, 'Read5': 21, 'Read4': 0, 'Read6': 0},
'Read5': {'Read1': 39, 'Read3': 0, 'Read2': 1, 'Read4': 0, 'Read6': 14},
'Read4': {'Read1': 1, 'Read3': 1, 'Read2': 17, 'Read5': 2, 'Read6': 0},
'Read6': {'Read1': 0, 'Read3': 43, 'Read2': 0, 'Read5': 0, 'Read4': 1}}
res = find_first_read(some_dict)
print(res)
Output
Read4
Steps
After the nested for loops, d
has the following value:
{'Read1': [0, 13, 39, 1, 0],
'Read2': [1, 0, 1, 17, 0],
'Read3': [0, 1, 0, 1, 43],
'Read4': [0, 1, 0, 0, 1],
'Read5': [1, 0, 21, 2, 0],
'Read6': [29, 1, 0, 14, 0]}
The final line uses next
to fetch the first value of the generator expression:
k for k, vs in d.items() if all(v < 2 for v in vs)
this expression iterates over the key, value pairs of d
and returns the keys that has all values less than 2
, the last part is checked using the function all
.
CodePudding user response:
You can try this:
positions=[]
for k, v in some_dict.items():
for x, y in v.items():
if y>=2:
positions.append(x)
positions = list(set(positions))
output=[]
for k in some_dict:
if k not in positions:
output.append(k)
print(output)
output:
['Read4']