如何使用嵌套字典遍历列表?

How to iterate through a list with nested dictionaries?

所以我有一个包含嵌套字典的列表,我想做的是从字典中读取视图的值并将它们放入乘数。

video_ads=({'title': 'Healthy Living', 'company': 'Health Promotion 
Board','views': 15934},
{'title': 'Get a ride, anytime anywhere', 'company': 'Uber', 'views': 
923834},
{'title': 'Send money with GrabPay', 'company': 'Grab', 'views': 23466},
{'title': 'Ubereats now delivers nationwide', 'company': 'Uber', 'views': 
1337},
{'title': 'Get cabs now with UberFlash', 'company': 'Uber', 'views': 90234})

所以我想做的是将标题和视图一起乘以某个因素,这就是我到目前为止所写的内容

def payment_for_views(x):
    for x in range(0,5):
        x = x+1

        if video_ads[x]['views'] >= 50000:
            payment = video_ads[x]['views']*0.55
        elif views <50000 and video_ads[x]['views'] >=10000:
            payment=video_ads[x]['views']*0.68
        else:
            payment = video_ads[x]['views']*0.82
    #print(x)
    print(video_ads[x]['title'] + ': $'+ str(payment))
    print(video_ads[x]['title'] + ': $'+ str(payment))
    print(video_ads[x]['title'] + ': $'+ str(payment))
    print(video_ads[x]['title'] + ': $'+ str(payment))
    print(video_ads[x]['title'] + ': $'+ str(payment))

但它似乎只打印一行,例如:

 Get cabs now with UberFlash: 628.700000000004
 Get cabs now with UberFlash: 628.700000000004
 Get cabs now with UberFlash: 628.700000000004
 Get cabs now with UberFlash: 628.700000000004
 Get cabs now with UberFlash: 628.700000000004

这就是我得到的全部。我需要 5 行,所有这些都有不同的标题和不同的数量。帮助!!!提前致谢!

for a in video_ads:
    print('%s: $%.2f' % (a['title'], a['views'] * (0.55 if a['views'] >= 50000 else 0.68 if a['views'] >= 10000 else 0.82)))

这输出:

Healthy Living: 835.12
Get a ride, anytime anywhere: 8108.70
Send money with GrabPay: 956.88
Ubereats now delivers nationwide: 96.34
Get cabs now with UberFlash: 628.70

您需要将 print 语句放在 for 循环中。

在循环之后和循环之外留下 print 意味着 x 将固定为 for 循环中设置的最终值。

def payment_for_views(x):
    for x in range(len(x)):
        if video_ads[x]['views'] >= 50000:
            payment = video_ads[x]['views']*0.55
        elif video_ads[x]['views'] <50000 and video_ads[x]['views'] >=10000:
            payment=video_ads[x]['views']*0.68
        else:
            payment = video_ads[x]['views']*0.82
        print(video_ads[x]['title'] + ': $'+ str(payment))

您可以通过多种方式改进代码:

  1. 直接迭代字典而不是按索引。
  2. 为每个字典提取一次 "views" 值并分配给一个变量。
  3. 使用链式比较检查一个值是否介于两个值之间。
  4. 使用指定小数精度的 f 字符串 (Python 3.6+)。

这是一个演示:

def payment_for_views(x):
    for item in x:
        views = item['views']
        if views >= 50000:
            factor = 0.55
        elif 10000 <= views < 50000:
            factor = 0.68
        else:
            factor = 0.82

        print(f'{item["title"]}: ${views*factor:.2f}')

payment_for_views(video_ads)

结果:

Healthy Living: 835.12
Get a ride, anytime anywhere: 8108.70
Send money with GrabPay: 956.88
Ubereats now delivers nationwide: 96.34
Get cabs now with UberFlash: 628.70
video_ads=({'title': 'Healthy Living', 'company': 'Health Promotion Board','views': 15934},
           {'title': 'Get a ride, anytime anywhere', 'company': 'Uber', 'views': 923834},
           {'title': 'Send money with GrabPay', 'company': 'Grab', 'views': 23466},
           {'title': 'Ubereats now delivers nationwide', 'company': 'Uber', 'views': 1337},
           {'title': 'Get cabs now with UberFlash', 'company': 'Uber', 'views': 90234})

def payment_for_views(item):
    if item >= 50000:
        payment = item * 0.55
    elif item < 50000 and item >= 10000:
        payment = item * 0.68
    else:
        payment = item * 0.82
    return payment

[print(per_ad['title'], ': $' + str(payment_for_views(per_ad['views']))) for per_ad in video_ads]

输出:

Healthy Living : 835.12

Get a ride, anytime anywhere : 8108.70000000007

Send money with GrabPay : 956.880000000001

Ubereats now delivers nationwide : 96.34

Get cabs now with UberFlash : 628.700000000004