Python 为什么在字典中提取数据时只打印最后一行还需要将“无”替换为0
代码如下Python 为什么在字典中提取数据时只打印最后一行还需要将“无”替换为0,python,Python,代码如下 from decimal import Decimal sample = [ ("Book", Decimal("10.000"), Decimal("0E-20"), None), ("Pen", Decimal("66.66666"), Decimal("0E-20"), None), ("Pencil", Decima
from decimal import Decimal
sample = [
("Book", Decimal("10.000"), Decimal("0E-20"), None),
("Pen", Decimal("66.66666"), Decimal("0E-20"), None),
("Pencil", Decimal("100.0000"), Decimal("0E-20"), 'G'),
]
data = {}
for i in sample:
try:
data['prod'] = i[0]
data['test1'] = round(i[1])
data['test2'] = round(i[2])
data['test3'] = round(i[3])
except:
pass
print(data)
我的输出是
{'prod': 'Pencil', 'test1': 100, 'test2': 0}
预计出炉的是全部3本字典
- 如果
,则在字典中它必须替换为0None
{'prod': 'Book', 'test1': 10.00, 'test2': 0, 'test3':0} {'prod': 'Pen', 'test1': 66.66, 'test2': 0, 'test3':0} {'prod': 'Pencil', 'test1': 100, 'test2': 0, 'test3':'G'}
.您需要创建字典列表,并将每个字典添加到其中:
from decimal import Decimal
sample = [
("Book", Decimal("10.000"), Decimal("0E-20"), None),
("Pen", Decimal("66.66666"), Decimal("0E-20"), None),
("Pencil", Decimal("100.0000"), Decimal("0E-20"), 'G'),
]
datalst=[] # <-----
for i in sample:
data = {} # <-----
data['prod'] = i[0]
data['test1'] = round(i[1])
data['test2'] = round(i[2])
data['test3'] = i[3] if i[3] else 0 # <---- if None add 0 else original value
datalst.append(data) # <-----
print(datalst)
从十进制导入十进制
样本=[
(“账簿”、十进制(“10.000”)、十进制(“0E-20”)、无、,
(“钢笔”、十进制(“66.66666”)、十进制(“0E-20”)、无、,
(“铅笔”、十进制(“100.0000”)、十进制(“0E-20”)、“G”),
]
datalst=[]#您可能希望这样做:
from decimal import Decimal
from collections import defaultdict
sample = [
("Book", Decimal("10.000"), Decimal("0E-20"), None),
("Pen", Decimal("66.66666"), Decimal("0E-20"), None),
("Pencil", Decimal("100.0000"), Decimal("0E-20"), 'G'),
]
data = defaultdict(list)
for i in sample:
try:
data['prod'].append(i[0])
data['test1'].append(round(i[1]))
data['test2'].append(round(i[2]))
data['test3'].append(round(i[3]))
except:
pass
print(dict(data))
将以下行打印到标准输出:
{'prod': ['Book', 'Pen', 'Pencil'], 'test1': [10, 67, 100], 'test2': [0, 0, 0], 'test3': []}
更新:
根据下面的注释,您需要不同的输出,因此我将上面的代码更改如下:
from decimal import Decimal
sample = [
("Book", Decimal("10.000"), Decimal("0E-20"), None),
("Pen", Decimal("66.66666"), Decimal("0E-20"), None),
("Pencil", Decimal("100.0000"), Decimal("0E-20"), 'G'),
]
data = []
for i in sample:
row = {}
try:
row['prod'] = i[0]
row['test1'] = round(i[1])
row['test2'] = round(i[2])
row['test3'] = i[3] or 0
except:
pass
finally:
data.append(row)
print(data)
产出为:
[{'prod': 'Book', 'test1': 10, 'test2': 0, 'test3': 0}, {'prod': 'Pen', 'test1': 67, 'test2': 0, 'test3': 0}, {'prod': 'Pencil', 'test1': 100, 'test2': 0, 'test3': 'G'}]
您有一个名为data
的字典,为什么希望有3个?您循环了3次,但覆盖了每个tiem键。python中的字典
都有distict键
。并且您正在三次将值设置为相同的键
如果您只想打印三个词典,请将print()
移动到try
块内的最后一行。你真的想创建三个独立的代码吗?试试
/,除了:pass
是代码气味最重的一种。你在压制每一个错误,除了对解释器的错误;这是一个很好的方法,可以让你不理解为什么你的代码会被破坏。如果没有其他错误,则将其设置为除了(IndexError,ValueError):
以消除预期的特定错误。我建议在调试时,将错误消息输出,以便您了解它何时触发(除了(indexer,ValueError)作为e:print('Errored on',I',with message',e)
)@ChristianDean:Sure;不知何故,我的脑海中有了float
(这将ValueError
放在str
上,但是是的None
仍然是TypeError
)。关键是,除了:pass
确保您不知道这是预期错误还是意外错误。Scott,我很尊重您的意见,但在帖子上发表评论不是更好吗?我不打算投反对票,因为它是正确的,但我不确定它是否真的回答了OP的问题?test3是0,0,'G',这是不会出现的,如果没有被0替换,如果没有与GOops相同的东西,剪贴板中的错误代码。现在它正在循环中处理data={}
。现在test3将是0,但情况并非如此[{'prod':'Book','test1':10,'test2':0,'test3':0},{'prod':'Pen','test1':67,'test2':0,'test3':0},{'prod':'Pencil',test1':100,'test2':0,'test3':'G}
哦,好的,你在哪里测试是否轮()是否在i[3]上工作。在这种情况下,您根本不需要try-Exception子句。请参阅更新的答案。test3是0,0,'G'不会出现,如果没有替换为0,如果没有替换,则不会出现与预期相同的内容[{'prod':'Book','test1':10,'test2':0,'test3':0},{'prod':'Pen test1':67,'test2':0,'test3':0},{'prod':'Pencil','test1':100,'test2':0,'test3':'G'}]