我正在玩一个简单的区块链。我想在我的代码中获取交易金额的总数,但此方法仅返回一个值!这是默认值。这是我的示例链。
"chain": [
{
"index": 1,
"previous_hash": "1",
"proof": 0,
"timestamp": "2021-07-13 12:46:27.100441",
"transactions": [
{
"amount": 0,
"reciver": "-",
"sender": "-"
}
]
},
{
"index": 2,
"previous_hash": "e267a3f77fe50af86466a9bc5fce5b8285cf3eff85260f402074505c6023a085",
"proof": 115558,
"timestamp": "2021-07-13 12:48:29.790718",
"transactions": [
{
"amount": 420.69,
"reciver": "John",
"sender": "Hoomehr"
},
{
"amount": 1142,
"reciver": "John",
"sender": "yaser"
},
{
"amount": 100,
"reciver": "Miner",
"sender": "01656f68288a45f993fc8c35c3d853d1"
}
]
},
{
"index": 3,
"previous_hash": "217a9bb5994943e03cef59edac125cc33c1831dce9d3ce8424ca134068e808b5",
"proof": 48245,
"timestamp": "2021-07-13 12:49:18.885861",
"transactions": [
{
"amount": 462,
"reciver": "Yaser",
"sender": "Hoomehr"
},
{
"amount": 32,
"reciver": "John",
"sender": "Hoomehr"
},
{
"amount": 100,
"reciver": "Miner",
"sender": "01656f68288a45f993fc8c35c3d853d1"
}
]
}
]
这是我的代码:
我尝试遍历每一层并进行 for 循环,同时我不知道我的语法是否错误或正确。
def total_trans(self):
balance=0
for i in self.chain:
for key , value in self.chain[0].items() :
for x in self.chain[0]['transactions']:
for k , v in self.chain[0]['transactions'][0].items():
balance += sum(self.chain[0]['transactions'][0]['amount'] for i in self.chain[0]['transactions'][0])
return balance
答案 0 :(得分:2)
我把原始链变成了一个 python 字典。如果您从外部文件导入此 JSON 对象,您可以使用 JSON built in libray 将其反序列化为 Python 对象。
block_chain = {"chain": [
{
"index": 1,
"previous_hash": "1",
"proof": 0,
"timestamp": "2021-07-13 12:46:27.100441",
"transactions": [
{
"amount": 0,
"reciver": "-",
"sender": "-"
}
]
},
{
"index": 2,
"previous_hash": "e267a3f77fe50af86466a9bc5fce5b8285cf3eff85260f402074505c6023a085",
"proof": 115558,
"timestamp": "2021-07-13 12:48:29.790718",
"transactions": [
{
"amount": 420.69,
"reciver": "John",
"sender": "Hoomehr"
},
{
"amount": 1142,
"reciver": "John",
"sender": "yaser"
},
{
"amount": 100,
"reciver": "Miner",
"sender": "01656f68288a45f993fc8c35c3d853d1"
}
]
},
{
"index": 3,
"previous_hash": "217a9bb5994943e03cef59edac125cc33c1831dce9d3ce8424ca134068e808b5",
"proof": 48245,
"timestamp": "2021-07-13 12:49:18.885861",
"transactions": [
{
"amount": 462,
"reciver": "Yaser",
"sender": "Hoomehr"
},
{
"amount": 32,
"reciver": "John",
"sender": "Hoomehr"
},
{
"amount": 100,
"reciver": "Miner",
"sender": "01656f68288a45f993fc8c35c3d853d1"
}
]
}
]
}
然后嵌套循环提取每个“金额”并将其添加到余额变量中,然后返回:
def total_trans(block_chain):
balance = 0
chain = block_chain["chain"] # get chain (list of blocks)
for block in chain: # each element in array (block, type dict)
for trans in block["transactions"]: # get transactions key
balance += trans["amount"] # add each amaout for each transaction to the balance
return balance
print(total_trans(block_chain)) # returns : 2256.69
在您的班级中,它看起来像:
def total_trans(self):
balance = 0
chain = self.block_chain["chain"] # get chain (list of blocks)
for block in chain: # each element in array (block, type dict)
for trans in block["transactions"]: # get transactions key
balance += trans["amount"] # add each amaout for each transaction to the balance
return balance
答案 1 :(得分:1)
是的,您一直引用链中的第一项,而不是让 for 循环遍历数据。
试试这个:
def total_trans(self):
balance = 0.0
for i in self.chain:
for x in i['transactions']:
balance += x['amount']
return balance
使用你的数据,我得到 balance
返回为 2256.69
一般来说,当你有这样一个深度嵌套的数据结构时,你应该编写你的程序,让它首先只有最外层的循环:for i in self.chain:
在你的情况下。然后你可以添加 print(i)
来看看你有什么。然后你会意识到你在追求 transactions
,然后你继续前进,迭代其他东西,然后打印,直到你得到你想要的东西。