#python #nested-loops
Вопрос:
Я новичок в программировании, у меня проблема с вложенными циклами. Я пытаюсь сопоставить идентификатор из образца sqlite с вложенными циклами for, «Сопоставьте альбомы с исполнителем». Я знаю, что, вероятно, есть много интересных способов сделать это, но я не понимаю, почему мой способ не сработал.
import sqlite3
co=sqlite3.connect("chinook.db")
album=co.execute("select*from albums")
artist=co.execute("select*from artists")
albumQuery=0
artistQuery=0
for row in album:
albumQuery =1
for x in artist:
artistQuery =1
if(x[0]==row[2]):
print(row[1] " " x[1])
print("Album Query:",albumQuery,"Artist Query",artistQuery)
Выход:
Для Тех, Кто Собирается Зажигать, Мы Приветствуем Вас Запрос на альбом AC/DC: 347 Запрос на исполнителя 275
Вот база данных, которую я использую: Образец базы данных SQLite
Он печатает только первый альбом с первым исполнителем. Я добавил целые числа, чтобы посмотреть, сколько раз выполняются циклы, и вот в чем проблема. Существует 347 альбомов, и их число достигает 375, но есть 275 исполнителей. Когда я добавляю переменную для подсчета «для x в художнике», я увидел, что она повторяется всего 275 раз, но, думаю, она должна быть 347*275. Что я делаю не так?
Комментарии:
1. Можете ли вы также добавить выходные данные ваших данных, т. е. исполнителя и альбом? Возможно, вам придется изменить свой цикл for, я смогу помочь, как только увижу фрагмент данных.
2.
When I add a variable to count
: Где находится эта переменная в вашем коде и где вы ее увеличиваете?3.
code
импорт sqlite3 для ко=sqlite3 для.подключиться(«Чинук.БД») альбом=со.выполнить(«выбрать из альбома») художник=со.выполнить(«выбор артистов») albumQuery=0 artistQuery=0 для строки в альбом: albumQuery =1 для X в художника: artistQuery =1, Если(х[0]==строка[2]): печать(строка[1] » » х[1]) печать(«альбом запроса:»,albumQuery,»художник запрос»,artistQuery)code
4. Я хотел бы видеть данные, которые вы получаете из sqlite, а не вывод вашего кода как такового
5. Ну, это просто образец базы данных chinook, если у вас есть время посмотреть : sqlitetutorial.net/sqlite-sample-database
Ответ №1:
co.execute
возвращает генератор. Все его содержимое используется после первой итерации внешнего цикла. Извлеките все содержимое генератора в список перед запуском цикла и выполните итерацию по списку:
artist = list(co.execute("select*from artists"))
Ответ №2:
Вот, пожалуйста, как сказал @DYZ:
import sqlite3
co=sqlite3.connect("chinook.db")
album = list(co.execute("select*from albums"))
artist = list(co.execute("select*from artists"))
albumQuery=0
artistQuery=0
for row in album:
albumQuery =1
for x in artist:
artistQuery =1
if (int(x[0]) == int(row[2])):
print(row[1] " " x[1])
# print("Album Query:",albumQuery,"Artist Query",artistQuery)
Комментарии:
1. Нет необходимости преобразовывать
album
в список.
Ответ №3:
Это похоже select*from albums
на возврат только одного товара.