Чтобы циклы перебирали два списка в запросе SQL, один из этих списков состоит из небольших списков. - PullRequest
0 голосов
/ 03 июля 2019

У меня есть большие базы данных, для которых я использую SQL-запрос в Python для записи данных в CSV-файлы.В базе данных sql каждая строка представляет собой последовательность пространственной информации для идентификатора пальца.Я могу параметризовать запрос, чтобы получить информацию и записать нужные мне файлы для каждого пальца.Однако проблема возникает при создании функционала цикла for, который выполняет итерацию по каждому идентификатору для всех индексов в списке.

INDEX = ([44,48,50,55,56,57], [49,54,57,61,62,64])


FINGER = ('rt100', 'rt101')

d = {}
newdf = {}

for Y in FINGER:
    for X in INDEX:
        for x in X:
            d[x] = pd.read_sql ("SELECT x,y, CAST( (direction*180/3.142)as INT),CAST(quality*100 as INT) from UTS_7_fingerprints where finger like ? and ind = ?", conn, params=(Y,x))
            newdf[Y] = pd.concat(d)

Приведенный выше скрипт выполняет запрос sql и успешно создает словарь объединенных структур данных.Однако для каждого значения FINGER выполняется итерация по всему списку INDEX.

Выглядит так:

{'rt100':      finger ind  ... CAST( (direction*180/3.142)as INT) CAST(quality*100 as INT)
44 0  rt100  44  ...                                281                       93
48 0  rt100  48  ...                                303                       32
49 0  rt100  49  ...                                281                       13
50 0  rt100  50  ...                                123                       82
54 0  rt100  54  ...                                281                       14
55 0  rt100  55  ...                                314                       67
56 0  rt100  56  ...                                123                       88
57 0  rt100  57  ...                                314                       71
61 0  rt100  61  ...                                326                       11

Это пример для одного из значений FINGER.Мне нужно, чтобы он повторял только [44,48,50,55,56,57] для 'rt100' и [49,54,57,61,62,64] для 'rt101'.В настоящее время он перебирает все значения в INDEX.В действительности у меня есть много подобных соответствий, следовательно, потребность в запросе, который принимает эти параметры.

Чтобы быть более конкретным, я ищу способ ограничить выполнение этого цикла, чтобы написать каждый запрос длякаждый FINGER и INDEX для разделения файлов .csv, которые выглядят следующим образом:

372,402,281,83
394,303,303,97
415,422,123,86
458,328,292,95
464,487,112,96
483,389,303,95

Где каждая строка является информацией:

'x,y, CAST( (direction*180/3.142)as INT),CAST(quality*100 as INT' 

для каждого INDEX в каждом FINGER.

1 Ответ

0 голосов
/ 03 июля 2019

Проблема здесь:

Однако для каждого значения FINGER выполняется итерация по всему списку INDEX

И это вызвано следующими циклами:

for Y in FINGER:
    for X in INDEX:
        # whatever

В этом случае whatever будет выполняться для всех комбинаций значений от FINGER и INDEX.Если у каждого есть N значения, строка whatever выполняется N*N раз.

Но вы хотите, чтобы она выполнялась только для некоторых из них, а именно с учетом FINGER = [f1, f2, ..., fN] и INDEX = [i1, i2, ..., iN], должно быть точноN итераций для значений (f1, i1), (f2, i2), ..., (fN, iN).

Для этого измените цикл:

for Y, X in zip(FINGER, INDEX):
    # whatever
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...