从pythonsqlite3查询求和数字

2024-10-05 13:25:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用我存储在SQLite数据库中的数字做一些数学运算。我的疑问似乎有用。我的问题是让python将我从数据库中查询到的数字视为数字。在

第一个定义从我的数据库中选择一个唯一的行。第二个定义循环遍历数据库中的许多行,并将它们添加到要求和的数字列表中。在

当我试图把数字相加时,问题就出现了。谁能给我指出正确的方向吗?在

以下是我的一些代码:

def query_symbol(symbolId):
    uniqueId = str(symbolId) + '@' + str(datetime.date.today())

    conn = sqlite3.connect('sql/databse.db')
    c = conn.cursor()
    with conn:
        c.execute("SELECT number FROM symbols WHERE uniqueId= ?", (uniqueId,))
    return c.fetchall()

def calc(filename):
    symbolIds = def_sec.load_symbolIds(filename)

    print(len(symbolIds))

    list = []

    for symbolId in symbolIds:
        data = query_symbol(symbolId)
        #data = data.replace('()','')
        list.append(data)
    print(list)

        total = sum(list)
        print(total)

calc('index_symbolids')

我的错误消息如下:

^{pr2}$

Tags: 数据库data定义defcalc数字connsymbol
2条回答

我看到了两个问题。让我们看看您打印出来的list

[[(13506636000.0,)], [(20156784500.0,)],  ... ]

它告诉我的是你有一个嵌套列表的列表(例如[(13506636000.0,)])。这表示一行和一列,因为返回c.fetchall()。在本例中,您肯定知道最多返回1行数据,因此我们可以使用c.fetchone()来减少嵌套列表的数量。在

接下来,看看这一行:

^{pr2}$

由于c.fetchone()返回(13506636000.0,),这是一个1元素的元组,因此可以使用以下技巧提取数字:

        (data,) = query_symbol(symbolId)

组合起来:

def query_symbol(symbolId):
    uniqueId = '{}@{}'.format(symbolId, datetime.date.today())

    with sqlite3.connect('sql/database.db') as conn:
        c = conn.execute(
            "SELECT number FROM symbols WHERE uniqueId=?",
             (uniqueId,))
    return c.fetchone()

def calc(filename):
    symbolIds = def_sec.load_symbolIds(filename)

    print(len(symbolIds))

    numbers = []

    for symbolId in symbolIds:
        (data, ) = query_symbol(symbolId)  # instead of `data =`
        numbers.append(data)

    print(numbers)
    total = sum(numbers)
    print(total)

calc('index_symbolids')

在这一点上,你应该得到想要的结果。在

更新

此更新解释了(data,) =的工作原理。假设,如果您有一个由3个元素组成的元组,并且想要分配给变量abc

(a, b, c) = (1, 2, 3)  # a=1, b=2, c=3

实际上,我们可以从等号左边去掉括号:

a, b, c = (1, 2, 3)  # a=1, b=2, c=3

对于1元素元组,表示法是(1,),而不是(1)(它只是1):

data = (1,)     # data = (1,), which is the whole tuple
(data,) = (1,)  # data = 1, which is what we want
data, = (1,)    # data = 1, but the syntax looks kind of wrong

回到您的问题,函数query_symbol()返回一个1元素元组,因此我们必须使用:

(data,) = query_symbol(symbolId)
data, = query_symbol(symbolId)

我个人喜欢第一个语法,因为第二个语法看起来逗号是错误的。在

The problem occurs when I try to sum the numbers.

不,你在试着给列表加和。在

total = sum(map(lambda x: x[0][0], list)

另外,您应该避免使用list作为变量,因为它隐藏了内置的list。在

相关问题 更多 >

    热门问题