【发布时间】:2016-12-20 22:09:55
【问题描述】:
我有以下代码,并试图迭代每一行的结果并检查“未训练”字典中的计算值是否大于 50%。但是,有些行是 NoneType 并且我收到错误:TypeError: 'NoneType' oject is not subscriptable。有没有办法我可以避免这种情况并仍然迭代以获得我想要的输出?
from collections import namedtuple
from itertools import zip_longest
trained = {'Dog': 4, 'Cat': 3, 'Bird': 1, 'Fish': 12, 'Mouse': 19, 'Frog': 6}
untrained = {'Cat': 6, 'Mouse': 7, 'Dog': 3, 'Wolf': 9}
Score = namedtuple('Score', ('total', 'percent', 'name'))
trained_scores = []
for t in trained:
trained_scores.append(
Score(total=trained[t],
percent=(trained[t]/(trained[t]+untrained.get(t, 0)))*100,
name=t)
)
untrained_scores = []
for t in untrained:
untrained_scores.append(
Score(total=untrained[t],
percent=(untrained[t]/(untrained[t]+trained.get(t, 0)))*100,
name=t)
)
# trained_scores.sort(reverse=True)
# untrained_scores.sort(reverse=True)
row_template = '{:<30} {:<30}'
item_template = '{0.name:<10} {0.total:>3} ({0.percent:>6.2f}%)'
print('='*85)
print(row_template.format('Trained', 'Untrained'))
print('='*85)
for trained, untrained in zip_longest(trained_scores, untrained_scores):
x = row_template.format(
'' if trained is None else item_template.format(trained),
'' if untrained is None else item_template.format(untrained)
)
print(x)
电流输出:
=====================================================================================
Trained Untrained
=====================================================================================
Mouse 19 ( 73.08%) Mouse 7 ( 26.92%)
Cat 3 ( 33.33%) Cat 6 ( 66.67%)
Frog 6 (100.00%) Wolf 9 (100.00%)
Dog 4 ( 57.14%) Dog 3 ( 42.86%)
Bird 1 (100.00%)
Fish 12 (100.00%)
期望的输出:
=====================================================================================
Trained Untrained
=====================================================================================
Mouse 19 ( 73.08%) Mouse 7 ( 26.92%)
Cat 3 ( 33.33%) Cat 6 ( 66.67%) <-- Above 50%
Frog 6 (100.00%) Wolf 9 (100.00%) <-- Above 50%
Dog 4 ( 57.14%) Dog 3 ( 42.86%)
Bird 1 (100.00%)
Fish 12 (100.00%)
更新!
使用有效的建议代码进行了更新。感谢大家的帮助!
if untrained is not None and untrained[1] > 50:
print(x + '<-- Above 50%')
else:
print(x)
结果:
=====================================================================================
Trained Untrained
=====================================================================================
Mouse 19 ( 73.08%) Wolf 9 (100.00%) <-- Above 50%
Fish 12 (100.00%) Mouse 7 ( 26.92%)
Frog 6 (100.00%) Cat 6 ( 66.67%) <-- Above 50%
Dog 4 ( 57.14%) Dog 3 ( 42.86%)
Cat 3 ( 33.33%)
Bird 1 (100.00%)
【问题讨论】:
-
total=trained[t]是什么意思?当你循环for t in trained:时,t已经包含了你需要的元素,而不是元素的索引。 -
@IgorPomaranskiy 在
dict上迭代会返回它的键...所以trained[t]将访问它的值... -
@JonClements 对不起,你是对的,我的错!
标签: python dictionary nonetype