как отфильтровать вывод sqlite - PullRequest
0 голосов
/ 18 февраля 2019

есть мой код

conn = sqlite3.connect('someDB.db')
c = conn.cursor()
c.execute("SELECT column FROM someDB")
result = c.fetchall()

, поскольку вы видите, что он подключается к БД, выбирает столбец и извлекает его в результат, так как в нем 4 строки, 1-я и 4-я равны нулю, когда я печатаюрезультат дает мне это

[(None,), ('useful',), ('useful',), (None,)]

почему есть скобки до и после каждого элемента;тоже элементы скобок;как мне избавиться от них, оставив только «Нет» и «полезные»

желаемый результат равен

[None, 'useful', 'useful', None]

Ответы [ 3 ]

0 голосов
/ 18 февраля 2019

Вы также можете использовать itertools

from itertools import chain

list(chain.from_iterable(result))

[None, 'useful', 'useful', None]

Причина, по которой ваши результаты возвращаются такими, какие они есть, заключается в том, что объект Cursor возвращает Row объекты.Это очевидно более очевидно / полезно, когда вы выбираете более 1 столбца из базы данных.

0 голосов
/ 18 февраля 2019

Хорошо, если база данных может быть большой, может быть неоптимальным сначала создать список из 1 кортежа, чтобы преобразовать его в список значений.Документация Python для sqlite3 объявляет об использовании fetchmany со значением по умолчанию для размера для оптимальной производительности.

Окончательный список может быть построен следующим образом:

result = []
while True:
    chunk = c.fetchmany()
    if len(chunk) == 0: break
    result.extend([row[0] for row in chunk])

Или, если вы предпочитаетепостроить список в одном понимании с помощью генератора:

def chunks(cursor):
    while True:
        chunk = c.fetchmany()
        if len(chunk) == 0: return
        yield chunk

...
result = [row[0] for chunk in chunks(c) for row in chunk]
0 голосов
/ 18 февраля 2019

Если вам всегда нужно получить первый элемент для каждого кортежа (синглтона) в вашем списке, «универсальным» способом:

inputs = [(None,), ('useful',), ('useful',), (None,)]
outputs = []
for tuples in inputs:
  outputs.append(tuples[0])

Если вы хотите что-то более питоническое, вы можете использовать понимание списка в python :

outputs = [tuples[0] for tuples in inputs]

Вы также можете использовать вариант, используя оператор "распространения" :

outputs = [first_element for (first_element, *other_elements) in inputs]

И, наконец,, может быть, лучший способ (я могу думать):

outputs = [first_element for (first_element, ) in inputs]
...