【问题标题】:Filtering dictionary keys by a function of their associated values通过关联值的函数过滤字典键
【发布时间】:2014-12-19 15:54:22
【问题描述】:

我有一本这样的字典

my_d = {"a": [1, 2, 2, 5, 2],"b": [2, 1, 2, 4, 5],"c": [7, 2, 2, 6, 2],"d": [7, 2, 2, 2, 1]}

我正在寻找字典值包含“2 且小于 2”两次以上的键。在示例中,这将是“a”、“b”、“c”、“d”。以下代码仅查找字典值包含 2 两次以上的那些:

for key, item in my_d.items():
    if item.count(2) > 2:
        print key,

【问题讨论】:

  • 我认为这与列表位于字典中这一事实没有太大关系,而更多的是关于列表中某些特定项目计数的问题。换句话说,为满足某些标准的关联值返回 dict 键的部分是微不足道的。
  • 描述有点模糊。您希望[ 1, 2, 3, 4] 符合条件吗?它有两个数字 = 2 次。

标签: python list dictionary count nested


【解决方案1】:

您可以对项目进行排序并检查前两个元素是否≤2:

>>> for key, item in my_d.items():
...   i=sorted(item)
...   if all(map(lambda x:x<=2,i[:2])):
...     print key,
...
a c b d

或者,因为您只有 2 个元素需要检查:

>>> for key, item in my_d.items():
...   i=sorted(item)
...   if i[0]<=i[1]<=2:
...     print key,
...
a c b d

【讨论】:

  • 注意:这个答案的时间和内存复杂度最差
【解决方案2】:
[key for key, item in my_d.items() if len([i for i in item if i<3]) > 2]

【讨论】:

    【解决方案3】:

    以下应该可以工作,这是一个简单的generator expression

    for key, item in my_d.items():
        if len ([x for x in item if x <= 2]) > 2:
            print key
    

    它的作用是构建item 中小于或等于 2 的所有元素的列表,并检查生成的列表的长度。

    【讨论】:

    • 不知道,该代码非常适合问题中的字典。但我有一个大约 32000 行和 52 列的数据集。我已经将它导出到字典中。当我为这么大的字典测试你的代码时,它给出了这个错误: ValueError: too many values to unpack.
    • @ali 该错误可能是由其他原因引起的:stackoverflow.com/questions/5466618/…
    • 不知道。我想我刚刚发现了问题。当我制作字典时,值将是字符串而不是这样的整数: my_d = {"a": ['1', '2', '2', '5', '2'],"b": [' 2', '1', '2', '4', '5'],"c": ['7', '2', '2', '6', '2'],"d": ['7', '2', '2', '2', '1'],"e":['1','3','4','2','6']}。我使用了 int() 函数但没有工作
    • 将字符串与整数进行比较不会导致ValueError
    【解决方案4】:
    print [k for k, v in my_d.items() if len(filter(lambda x: x <= 2, v)) > 2] # ['a', 'c', 'b', 'd']
    

    【讨论】:

      【解决方案5】:

      你可以这样做 -

      f1 = lambda x: [obj for obj in x if obj <= 2]
      
      results = [k for k, v in d1.items() if len(f1(v)) >= 2]
      

      对每个值运行 lambda 函数

      【讨论】:

        【解决方案6】:
        >>> my_d = {"a": [1, 2, 2, 5, 2],"b": [2, 1, 2, 4, 5],"c": [7, 2, 2, 6, 2],"d": [7, 2, 2, 2, 1],"e":[1,3,4,2,6]}
        >>> [k for k,v in my_d.items() if len([i for i in v if i<3])>2]
        ['a', 'c', 'b', 'd']
        

        【讨论】:

          猜你喜欢
          • 2017-03-27
          • 2020-05-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-21
          • 1970-01-01
          • 1970-01-01
          • 2021-12-27
          相关资源
          最近更新 更多