Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何匹配dict和merge结果中的两个值_Python_Sorting_Dictionary - Fatal编程技术网

Python 如何匹配dict和merge结果中的两个值

Python 如何匹配dict和merge结果中的两个值,python,sorting,dictionary,Python,Sorting,Dictionary,假设我有一些带有时间戳、价格和金额的数据。这些数据可能相当大,并且匹配条件可能发生在组中的任何位置。下面是一个简单的例子: [{"date":1387496043,"price":19.379,"amount":1.000000} {"date":1387496044,"price":20.20,"amount":2.00000} {"date":1387496044,"price":10.00,"amount":0.10000} {"date":1387496044,"price":20.20

假设我有一些带有时间戳、价格和金额的数据。这些数据可能相当大,并且匹配条件可能发生在组中的任何位置。下面是一个简单的例子:

[{"date":1387496043,"price":19.379,"amount":1.000000}
{"date":1387496044,"price":20.20,"amount":2.00000}
{"date":1387496044,"price":10.00,"amount":0.10000}
{"date":1387496044,"price":20.20,"amount":0.300000}]
我如何对其进行排序,以便合并具有相同时间戳和相同价格的任何项目的数量

因此,结果如下所示(注意,2.0和0.3的金额相加):

我尝试过许多复杂的方法(使用Python 2.7.3),但我对Python不是很了解。我相信有一个很好的方法可以找到两个匹配的值,然后用新的数量更新一个值,并删除重复的值

仅供参考,这是测试数据

L=[{"date":1387496043,"price":19.379,"amount":1.000000},{"date":1387496044,"price":20.20,"amount":2.00000},{"date":1387496044,"price":10.00,"amount":0.10000},{"date":1387496044,"price":20.20,"amount":0.300000}]

最好的方法可能是制作一本以(日期、价格)为键的字典。如果遇到重复的密钥,可以组合字段以保持密钥的唯一性

def combine(L):
    results = {}
    for item in L:
        key = (item["date"], item["price"])
        if key in results:  # combine them
            results[key] = {"date": item["date"], "price": item["price"], "amount": item["amount"] + results[key]["amount"]}
        else:  # don't need to combine them
            results[key] = item
    return results.values()

对于您的示例,这将是一个稍微混乱的O(n)解决方案,显然可以推广到解决您的初始问题。

FWIW您可以使用数据库操作:

records = [
    {"date":1387496043,"price":19.379,"amount":1.000000},
    {"date":1387496044,"price":20.20,"amount":2.00000},
    {"date":1387496044,"price":10.00,"amount":0.10000},
    {"date":1387496044,"price":20.20,"amount":0.300000},
]

import sqlite3
db = sqlite3.connect(':memory:')
db.row_factory = sqlite3.Row
db.execute('CREATE TABLE records (date int, price float, amount float)')
db.executemany('INSERT INTO records VALUES (:date, :price, :amount)', records)
sql = 'SELECT date, price, SUM(amount) AS amount FROM records GROUP BY date, price'
records = [dict(row) for row in db.execute(sql)]
print(records)

一种基于默认dict的方法

from collections import defaultdict
d = defaultdict(float)
z = [{"date":1387496043,"price":19.379,"amount":1.000000},
{"date":1387496044,"price":20.20,"amount":2.00000},
{"date":1387496044,"price":10.00,"amount":0.10000},
{"date":1387496044,"price":20.20,"amount":0.300000}]
for x in z:
    d[x["date"], x["price"]] += x["amount"]
print [{"date": k1, "price": k2, "amount": v} for (k1, k2), v in d.iteritems()] 
[{'date': 1387496044, 'price': 10.0, 'amount': 0.1},
{'date': 1387496044, 'price': 20.2, 'amount': 2.3},
{'date': 1387496043, 'price': 19.379, 'amount': 1.0}]

你想按什么排序?约会?价格?此外,在本例中,您不合并(添加?),而是过滤掉重复项。这就是您想要的吗?从您的sql查询来看,您似乎明白了。我将所有具有相同时间戳和价格的项目的金额合并到一个项目中,然后删除其他项目。我应该提到我使用的是2.7.3。我知道你在做什么,但对python来说是新手。我不懂语法。key=(item[[“date”]、item[“price”])生成语法错误。有趣的是,我也没有看到。我遇到了与我自己尝试了几件事情时遇到的相同的错误:key=(item[“date”]、item[“price”])TypeError:string索引必须是整数如果我使用打印类型(L)我明白了。我的数据中的列表确实包含了几个键:值,但这些值应该被忽略,对吗?如果能看到您正在使用的实际数据,那就太好了。当我使用Python 2.7.5输入类似于您的示例的内容时,一切都按预期工作。也许我做错了一些基本的事情。但是我把测试数据放在了问题中。哦,天哪…你在开玩笑吗?:如果我已经从一个数据库开始,这不是个坏主意。
from collections import defaultdict
d = defaultdict(float)
z = [{"date":1387496043,"price":19.379,"amount":1.000000},
{"date":1387496044,"price":20.20,"amount":2.00000},
{"date":1387496044,"price":10.00,"amount":0.10000},
{"date":1387496044,"price":20.20,"amount":0.300000}]
for x in z:
    d[x["date"], x["price"]] += x["amount"]
print [{"date": k1, "price": k2, "amount": v} for (k1, k2), v in d.iteritems()] 
[{'date': 1387496044, 'price': 10.0, 'amount': 0.1},
{'date': 1387496044, 'price': 20.2, 'amount': 2.3},
{'date': 1387496043, 'price': 19.379, 'amount': 1.0}]