【问题标题】:Get the key with the minimum value in a dictionary of dictionaries获取字典中具有最小值的键
【发布时间】:2021-12-11 17:08:17
【问题描述】:

我必须编写一个函数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

【问题讨论】:

  • 为什么想要的输出是Read4?到处都有小于 2 的值。
  • 是因为Read4的所有值都小于2吗?
  • 是的,正确的。 Read4 的所有值都小于 2

标签: python dictionary for-loop


【解决方案1】:

您实际上是在尝试将您的 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']]

【讨论】:

    【解决方案2】:

    用途:

    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 进行检查。

    【讨论】:

      【解决方案3】:

      你可以试试这个:

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

      【讨论】:

        猜你喜欢
        • 2012-04-14
        • 2014-07-07
        • 1970-01-01
        • 1970-01-01
        • 2014-03-08
        • 2020-03-28
        • 1970-01-01
        • 2015-04-22
        • 2021-12-06
        相关资源
        最近更新 更多