gpt4 book ai didi

python - 对于类似的命令,python 和 mysql 的结果不同

转载 作者:行者123 更新时间:2023-11-29 14:34:38 25 4
gpt4 key购买 nike

我正在使用 python 创建字典,但随着数据变大,我开始出现内存错误,所以我想我可以节省内存,只需将数据写入数据库,但结果并不相同。我认为这与 defaultdict 的行为有关(但我不确定)。

这是工作的Python代码(它基本上构建了一个值表):

from collections import defaultdict
data = [2,5,10]
target_sum = 100
# T[x, i] is True if 'x' can be solved
# by a linear combination of data[:i+1]
T = defaultdict(bool) # all values are False by default
T[0, 0] = True # base case

for i, x in enumerate(data): # i is index, x is data[i]
for s in range(target_sum + 1): #set the range of one higher than sum to include sum itself
for c in range(s / x + 1):
if T[s - c * x, i]:
T[s, i+1] = True

#check the python dict results
count = 0
for x in T:
if T[x] == True:
print x, ':', T[x]
count = count +1

print 'total count is ', count
#False is 152 and True is 250. Total is: 402

结果是一个很大的值表(您可以在注释中看到分割。这是我想要的正确结果),但是当我更改第一个 for 语句的最后一行以添加到数据库而不是本地字典,结果不同。

这是我修改后的有问题的代码:

cursor = conn.cursor ()
cursor = conn.cursor ()
cursor.execute ("DROP TABLE IF EXISTS data_table")
cursor.execute ("""
CREATE TABLE data_table
(
value CHAR(80),
state BOOL
)
""")
#with database
for i, x in enumerate(data): # i is index, x is data[i]
for s in range(target_sum + 1): #set the range of one higher than sum to include sum itself
for c in range(s / x + 1):
cursor.execute(""" SELECT value, state FROM data_table WHERE value='%s' """ % ([s - c * x, i]))
if cursor.rowcount == 0:
#print 'nothing found, adding'
cursor.execute (""" INSERT INTO data_table (value, state) VALUES ('%s', False)""" % ([s - c * x, i]))
elif cursor.rowcount == 1:
cursor.execute (""" UPDATE data_table SET state=True WHERE value = '%s'""" % ([s - c * x, i]))
#print 'record updated'
conn.commit()

#False is 17 and True is 286. Total is: 303

总结一下(如果您不想运行代码),defaultdict 在查询某些内容时会创建一个错误条目(在本例中 if T[s - c * x, i]: )因此,为了复制此功能,我会在 mysql 中查找该值,如果它不存在,则创建它,如果存在,则将其设置为 true。我高度怀疑我未能正确复制功能

我唯一想到的另一件事是 python 将结果显示为 (222, 0) : False 但 mysql 正在执行 [222,0] 不确定这是否会产生影响。

最佳答案

您的两个示例没有更新相同的 key :

# First example
if T[s - c * x, i]:
T[s, i+1] = True
# Key is (s, i+1)

# Second example
elif cursor.rowcount == 1:
cursor.execute (""" UPDATE data_table SET state=True WHERE value = '%s'""" % ([s - c * x, i]))
# Key is (s - c * x, i)

IMO 将真实案例存储在数据库中会更有意义,这可能会使您的程序更简单。否则,您还需要检查数据库中是否存在 (s, i+1),如果存在则将其更新为 True,如果不存在则创建一个新行。

附注我还错过了将 (0, 0) 设置为 True 的命令。难道不应该在创建数据库之后插入插入吗?

更新:还在代码中发现了另一个问题:select命令只检查行是否存在,而不是它的值是什么。要正确复制您的第一个示例,您的代码应该是:

cursor.execute (""" INSERT INTO data_table (value, state) VALUES ('%s', True)""" % ([0, 0]))
conn.commit()
# Inserted the (0,0) case
for i, x in enumerate(data):
for s in range(target_sum + 1):
for c in range(s / x + 1):
cursor.execute(""" SELECT value, state FROM data_table WHERE value='%s' """ % ([s - c * x, i]))
if cursor.rowcount == 0:
cursor.execute (""" INSERT INTO data_table (value, state) VALUES ('%s', False)""" % ([s - c * x, i]))
elif cursor.rowcount == 1:
(value, state) = cursor.fetchone() # Gets the state
if state: # equivalent to your if in the first example
insertOrUpdate(conn, [s, i+1])
conn.commit()

更改了注释行。

更新 2:这还不够......(正如我所说,如果您只存储 True 值,事情会简单得多)。为了便于阅读,将 if 内的部分移至此处:

def insertOrUpdate(conn, key):
cursor.execute(""" SELECT value, state FROM data_table WHERE value='%s' """ % key)
if cursor.rowcount == 0:
# Insert as True if not exists
cursor.execute (""" INSERT INTO data_table (value, state) VALUES ('%s', True)""" % key)
elif cursor.rowcount == 1:
(value, state) = cursor.fetchone()
if !state:
# Update as True, if it was False
cursor.execute (""" UPDATE data_table SET state=True WHERE value = '%s'""" % key)
<小时/>

更新 3:作为对比,看看通过仅存储 True 值,程序会变得更加简单。它还使用更少的磁盘空间,花费更少的时间,并且行为更像默认字典。

cursor = conn.cursor ()
cursor.execute ("DROP TABLE IF EXISTS data_table")
cursor.execute ("""
CREATE TABLE data_table(
value CHAR(80)
)
""")

cursor.execute (""" INSERT INTO data_table (value) VALUES ('%s')""" % [0, 0])
conn.commit()

for i, x in enumerate(data): # i is index, x is data[i]
for s in range(target_sum + 1): #set the range of one higher than sum to include sum itself
for c in range(s / x + 1):
cursor.execute(""" SELECT value FROM data_table WHERE value='%s' """ % ([s - c * x, i]))
if cursor.rowcount == 1:
cursor.execute(""" SELECT value FROM data_table WHERE value='%s' """ % [s, i+1])
if cursor.rowcount == 0:
cursor.execute (""" INSERT INTO data_table (value) VALUES ('%s')""" % [s, i+1])
conn.commit()

关于python - 对于类似的命令,python 和 mysql 的结果不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9336724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com