【问题标题】:how to get list of dictionarys value如何获取字典值列表
【发布时间】:2021-11-02 15:15:19
【问题描述】:

首先我真的很抱歉我不应该问这个问题。 我有一个字典列表,这个字典包含如下键值:

dictList = [
            {
             0:1,
             1:1,
             2:None
             },
            {
             0:0,
             1:None,
             2:None
            },
           {
            0:0,
            1:1,
            2,1
           }
          ]

如果 dictList 的所有元素都不是,我想将它附加到另一个列表中。例如dictList[2] 没有 None 值我想将该字典附加到另一个列表。

我试图用 flag 来写它,但我认为我必须创建一个 flag 数组并检查 flagArray 不包含 False,例如:

for i in range(len(dictList)):
dictLoop = lastCombination[i]
flagArray = []
for k,v in dictLoop.items():
    if(v is None):
        flagArray.append(False)
    else:
        flagArray.append(True)
    if(flagArray.__contains__(False)):
        showCombinationWithZero.append(dictList[i])
        
    else:
        showCombinationWithOutZero.append(dictList[i])

效果不好。 感谢您的建议。

【问题讨论】:

    标签: python list dictionary


    【解决方案1】:

    您可以使用列表推导过滤掉具有None 值的字典。例如:

    dictList = [{0:1,1:1,2:None},
               {0:0, 1:None, 2:None},
               {0:0,1:1,2:1}]
    
    filtered = [d for d in dictList if all(v is not None for v in d.values())]
    # [{0: 0, 1: 1, 2: 1}]
    

    这只是从列表中选择满足条件的项目:

    all(v is not None for v in d.values())
    

    也就是说所有值都不是None

    你可以对None的人做相反的事情:

    [d for d in dictList if any(v is None for v in d.values())]
    

    要在一个循环中完成,您可以将测试用作两个列表的索引:

    dictList = [{0:1,1:1,2:None},
                {0:0, 1:None, 2:None},
                {0:0,1:1,2:1}]
    
    lists = [[], []]
    
    for d in dictList:
        i = all(v is not None for v in d.values())
        lists[i].append(d)
    
    showCombinationWithZero, showCombinationWithoutZero = lists
    # ([{0: 1, 1: 1, 2: None}, {0: 0, 1: None, 2: None}], [{0: 0, 1: 1, 2: 1}])
    

    【讨论】:

      【解决方案2】:

      这是一个源自您的代码,其中包含两个 for 循环:

      • 外部for 循环遍历列表中的每个字典。
      • 内部for 循环遍历每个键和值对以检查None

      如果任何值为None,则contains_none 值设置为True。所以,这个字典被忽略了。

      如果所有值都有效,则变量将保持False,并且字典将被添加到单独的列表中。

      dictList = [{0:1,1:1,2:None},
                 {0:0, 1:None, 2:None},
                 {0:0,1:1,2:1}]
                 
      good_dict = []
      for d in dictList:
          contains_none = False
          for k, v in d.items():
              if v == None:
                  contains_none = True
                  
          if not contains_none:
              good_dict.append(d)
          else:
              print(f"{d} has None")
      print(good_dict)
      

      【讨论】:

        【解决方案3】:

        你可以使用

        nones = not all(i.values())
        

        如果所有值都不是无,nones 将设置为 False,否则设置为 True。
        有了这个,你可以使你的代码如下:

        for i in range(len(dictList)):
            nones = not all(i.values())
            if not nones:
                showCombinationWithOutZero.append(dictList[i])
           else:
                showCombinationWithZero.append(dictList[i])
        

        【讨论】:

        • 您应该仔细检查上一个代码示例中的 i 是什么。此外,当 OP 的数据中的某些值是 0 时,像这样使用 all() 将是一个问题。
        • 我在这里看到了这个答案stackoverflow.com/a/32308388/3485434
        • 我建议尝试运行它而不是从另一个答案中复制它而不尝试它。它没有运行。
        【解决方案4】:

        一条线就可以搞定。

        [x for x in dictList if all([not bool(v is None) for v in x.values()])]
        

        说明

        [not bool(v is None) for v in x.values()]
        
        1. 创建一个布尔值列表,如果值为 None,则为 False。
        2. 使用all() 检查所有值是否为真。
        3. 仅当所有值都不是 None 时才返回。

        【讨论】:

          猜你喜欢
          • 2013-08-22
          • 1970-01-01
          • 2011-11-08
          • 2013-08-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多