python 有了这个字典列表,我如何访问特定的行并将不同的行相互比较?

hivapdat  于 2022-11-21  发布在  Python
关注(0)|答案(1)|浏览(96)

例如,我需要查找冲销交易(行1和3以及行2和4包含冲销交易)

m_data =
{"account": "z*", 'amount': 200, "day": 3, "month": "June",

"account" : "y*", "amount": -100, "day": 9, 'month': 'May',

"account": "z*", 'amount': -200, 'day': 21, 'month': 'June'

"account" : "y", "amount" : 150, "day" : 10 month" : "May"

"account" : "x*", "amount" : 30, "day" : 16 "month": "August"

"account", "x*", 'amount': 100, "day": 5, "month": "June"}

但是我不明白用哪种方法来比较特定键和特定值?
我该用什么方法来计算呢?Shpudl我总结一下:z,数量:200和帐户:z,数量:-200?,然后对“行”2和4执行相同的操作

wb1gzix0

wb1gzix01#

你在这里发布的内容并不是有效的Python,因为你只创建了一个dict,但是你多次赋值给同一个键。我认为你试图做的事情更像这样:

m_data = [
    {"account": "z*", 'amount': 200, "day": 3, "month": "June"},
    {"account" : "y*", "amount": -100, "day": 9, 'month': 'May'},
    {"account": "z*", 'amount': -200, 'day': 21, 'month': 'June'},
    {"account" : "y", "amount" : 150, "day" : 10, "month" : "May"},
    {"account" : "x*", "amount" : 30, "day" : 16, "month": "August"},
    {"account", "x*", 'amount': 100, "day": 5, "month": "June"}
]

如果您在此结构中有数据,并且希望通过accountamount字段进行关联,则有两个基本选项。执行此操作的简单但缓慢的方法是简单的线性搜索,在该方法中,您扫描每个事务的整个列表:

num_transactions = len(m_data)
for i in range(num_transactions):
    for j in range(i+1, num_transactions):
        if (m_data[i]["account"] == m_data[j]["account"] and
            m_data[i]["amount"] == -m_data[j]["amount"]):
            # m_data[i] and m_data[j] are the reverse of each other
            # so do whatever you need to with them here
            break

这是一个二次时间算法,或者说是O(n^2),如果你熟悉这种表示法的话,这意味着当列表中的项目数量变大时,它确实会变得非常慢。为了做得更好,你需要把它们转换成一个按账户和金额索引的dict
您可以使用for循环来完成此操作:

tx_table = {}
for tx in m_data:
    tx_table[(tx["account"], tx["amount"])] = tx

或者更像Python,你可以使用字典理解:

tx_table = {
    (tx["account"], tx["amount"]): tx for tx in m_data
}

这是一个线性的(O(n))运算,而且查找反向事务的速度会快很多:

for tx in m_data:
    try:
        reverse = tx_table[(tx["account"], -tx["amount"])]
        # The reverse was found, handle it here
    except KeyError:
        # There's no reverse transaction of this one
        pass

最后要注意的是,这样做的一个结果是每个反向事务将被发现两次--一次是第一个事务,另一次是在循环到达第二个事务时(因为它们都是彼此的反向事务)。
一个简单的补救方法是,一旦找到当前事务,就从字典中删除它,假设您不需要重用它,如下面更新的代码所示(代码删除了两者,因为不再需要它们,如果事务数量非常大,较小的dict将稍微加快循环的其余部分)。
如果确实需要重用它,可以使用set()来跟踪哪些事务已经匹配,并跳过它们而不改变tx_table

for tx in m_data:
    try:
        reverse = tx_table[(tx["account"], -tx["amount"])]
        # Remove both transactions now the match has been found
        del tx_table[(tx["account"], tx["amount"])]
        del tx_table[(tx["account"], -tx["amount"])]
        # The reverse was found, handle it here
    except KeyError:
        # There's no reverse transaction of this one
        pass

希望能帮上忙。

相关问题