如何按值过滤字典? [复制]

Posted

技术标签:

【中文标题】如何按值过滤字典? [复制]【英文标题】:How to filter dictionary by value? [duplicate] 【发布时间】:2018-08-24 14:16:54 【问题描述】:

我有"site_mame": (side_id, frequency)格式的字典:

d=['fpdownload2.macromedia.com': (1, 88),
  'laposte.net': (2, 23),
  'www.laposte.net': (3, 119),
  'www.google.com': (4, 5441),
  'match.rtbidder.net': (5, 84),
  'x2.vindicosuite.com': (6, 37),
  'rp.gwallet.com': (7, 88)]

有没有一种聪明的方法来按值过滤字典 d 以便我只有那些频率小于 100 的位置?例如:

d=['fpdownload2.macromedia.com': (1, 88),
  'laposte.net': (2, 23),
  'match.rtbidder.net': (5, 84),
  'x2.vindicosuite.com': (6, 37),
  'rp.gwallet.com': (7, 88)]

我不想使用循环,只是寻找智能高效的解决方案...

【问题讨论】:

您发布的代码表明您实际上有一个包含 dict 的 1 项列表? @Baduker 我不确定他们是否足够接近,以至于按值排序的答案显然对有这个问题的人有帮助。 [k: (s, f) for k, (s, f) in sub.items() if f < 100 for sub in d] @Chris_Rands,请发布答案:) 【参考方案1】:

您可以将字典推导与解包一起使用以获得更 Pythonic 的结果:

d=['fpdownload2.macromedia.com': (1, 88),
  'laposte.net': (2, 23),
  'www.laposte.net': (3, 119),
  'www.google.com': (4, 5441),
 'match.rtbidder.net': (5, 84),
 'x2.vindicosuite.com': (6, 37),
 'rp.gwallet.com': (7, 88)]
new_data = [a:(b, c) for a, (b, c) in d[0].items() if c < 100]

输出:

['laposte.net': (2, 23), 'fpdownload2.macromedia.com': (1, 88), 'match.rtbidder.net': (5, 84), 'x2.vindicosuite.com': (6, 37), 'rp.gwallet.com': (7, 88)]

【讨论】:

【参考方案2】:

你想要的是字典理解。我将用一个不同的例子来展示它:

d = 'spam': 120, 'eggs': 20, 'ham': 37, 'cheese': 101

d = key: value for key, value in d.items() if value >= 100

如果您还不了解列表推导,这可能看起来像魔法一样,您将无法维护和调试,因此我将向您展示如何将其分解为您应该使用的显式循环语句容易理解:

new_d = 
for key, value in d.items():
    if value >= 100:
        new_d[key] = value

如果您不知道如何将其转回理解,只需使用语句版本,直到您了解更多;它有点冗长,但最好有可以在脑海中思考的代码。

您的问题稍微复杂一些,因为这些值不仅仅是一个数字,而是两个数字的元组(因此您要过滤 value[1],而不是 value)。并且因为您有一个 dict 而不仅仅是一个 dict 的列表(因此您可能需要为列表中的每个 dict 执行此操作)。当然,我的过滤器测试和你的不一样。但希望你能从这里弄清楚。

【讨论】:

【参考方案3】:

您可以使用字典推导进行过滤:

d = 
    'fpdownload2.macromedia.com': (1, 88),
    'laposte.net': (2, 23),
    'www.laposte.net': (3, 119),
    'www.google.com': (4, 5441),
    'match.rtbidder.net': (5, 84),
    'x2.vindicosuite.com': (6, 37),
    'rp.gwallet.com': (7, 88),


d_filtered = 
    k: v
    for k, v in d.items()
    if v[1] < 100

【讨论】:

以上是关于如何按值过滤字典? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何按值对 Python 字典进行排序? [复制]

使用 LINQ 按值过滤字典时遇到问题

在python中按值删除字典项的最佳方法是啥? [复制]

如何按值的 DateTime 属性对字典进行排序

当每个字典都有不同的键时,如何按值对字典列表进行排序?

如何按值和键的多个条件对嵌套字典进行排序?