如何通过值过滤字典?

2024-05-23 19:53:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有"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)}]

我不想使用循环,只是在寻找智能高效的解决方案。。。你知道吗


Tags: comnet字典wwwmatchsiterpx2
3条回答

你想要的是一本字典。我将用另一个例子来说明:

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)。因为你有一个单字的列表而不仅仅是一个单字(所以你可能需要为列表中的每一个单字都这样做)。当然,我的过滤测试和你的不一样。但希望你能从这里找到答案。你知道吗

您可以将字典理解与解包结合使用,以获得更具python效果:

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)}]

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

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
}

相关问题 更多 >