簡體   English   中英

獲取字典字典中具有最小值的鍵

[英]Get the key with the minimum value in a dictionary of dictionaries

我必須編寫一個函數find_first_read才能在字典中找到包含小於 2 的值的特定讀取鍵

期望的輸出

find_first_read(some_dict)
'Read4'

我應該在下面的代碼中更改什么以獲得所需的輸出:

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

您實際上是在嘗試將 min_value 與另一個字典進行比較。 您必須添加另一個循環來獲取嵌套值。 為了使輸出更清晰,我將其作為鍵列表而不是單個鍵返回以彌補嵌套。

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))

輸出:

[['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']]

用:

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)

輸出

Read4

腳步

在嵌套的 for 循環之后, d具有以下值:

{'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]}

最后一行使用next來獲取生成器表達式的第一個值:

k for k, vs in d.items() if all(v < 2 for v in vs)

此表達式迭代d的鍵值對,並返回所有值都小於2的鍵,使用函數all檢查最后一部分。

你可以試試這個:

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)

輸出:

['Read4']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM