如何按值过滤字典?

时间:2018-03-15 16:52:41

标签: python dictionary filter

我的字典格式为"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)}]

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

3 个答案:

答案 0 :(得分:4)

你可以使用字典理解和解包来获得更多的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)}]

答案 1 :(得分:1)

您可以使用词典理解来进行过滤:

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
}

答案 2 :(得分:0)

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

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执行此操作)。当然,我的过滤器测试与您的相同。但希望你能从这里弄明白。