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本字典

  • 如果
    None
    ,则在字典中它必须替换为0

     {'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'}]