迭代包含字典列表的字典列表

时间:2021-07-13 10:42:21

标签: python loops dictionary for-loop iteration

我正在玩一个简单的区块链。我想在我的代码中获取交易金额的总数,但此方法仅返回一个值!这是默认值。这是我的示例链。

"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

2 个答案:

答案 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,然后你继续前进,迭代其他东西,然后打印,直到你得到你想要的东西。