向python字典添加多个键值对,然后检查重复值
我是python新手,正在阅读gzip文件中的一行代码-向python字典添加多个键值对,然后检查重复值,python,python-3.x,postgresql,Python,Python 3.x,Postgresql,我是python新手,正在阅读gzip文件中的一行代码- ('ABC',孟买',无,无,'123',无,无)xx 1191 ('ABC','孟买',无,无,'123',无,无)xx 1 1000 有这4个值,其中我必须检查是否已经存在第1个和第3个元素的组合。如果存在,我们必须对第四个元素求和,并将其插入Postgres DB 输出- ('ABC', 'MUMBAI', None, None, '123', None, None) xx 1 2191 当我在Postgres数据库中插入这些行
('ABC',孟买',无,无,'123',无,无)xx 1191
('ABC','孟买',无,无,'123',无,无)xx 1 1000
有这4个值,其中我必须检查是否已经存在第1个和第3个元素的组合。如果存在,我们必须对第四个元素求和,并将其插入Postgres DB
输出-
('ABC', 'MUMBAI', None, None, '123', None, None) xx 1 2191
当我在Postgres数据库中插入这些行时,该数据库对第一个属性、第二个属性、第三个属性和日期具有唯一约束。我得到“重复键值违反唯一约束”
我试着创建一个字典,如果发现重复的记录,就更新它,但我无法通过。我不想添加另一个循环并遍历整个gzip文件。是否有任何优化的解决方案?考虑到
记录了您的数据的一部分,例如
记录=[
((‘ABC’、‘孟买’、无、无、‘123’、无、无)、xx、1191),
((‘ABC’、‘孟买’、‘无’、‘123’、‘无’、‘无’)、xx、11000),
...
]
你的问题可以这样解决
导入集合
总和=集合。默认dict(int)
记录中的记录:
key=(记录[0],记录[2])#第一个和第三个元素的组合
和[键]+=记录[3]
我从@michaeldel的答案中找到了一条线索,然后找到了解决办法-
sql_query_template = "INSERT INTO product_data.data VALUES ( (%s) , (%s) , %s , '%s' , %d );"
master_dict = collections.defaultdict(int)
imported_dict = collections.defaultdict(int)
for line in self.gziplines(`enter code here`filename):
line=line.replace("\0", " ")
product, category, attribute, value = self.split_line(line)
key = (product, attribute)
if key not in master_dict:
master_dict[key] = value
else:
master_dict[key] += value
for line in self.gziplines(filename):
line=line.replace("\0", " ")
if product[0] != None and key not in imported_dict:
sql_query = sql_query_template % (category, product, attribute, date, master_dict.get(key))
cur.execute(sql_query)
imported_dict[key] = master_dict.get(key)
谢谢你的回答。它有帮助,但它返回一个int字典-defaultdict(,{('ABC',MUMBAI',None,None,None,'123',None,None,None),1):1191}),而我需要遍历zip中的行(对于self.gziplines(filename))中的行,我需要行而不是字典。只需迭代该字典并打印项目即可获得所需的输出