对于循环遍历sql查询中的两个列表的情况,这些列表之一由较小的列表组成

时间:2019-07-03 06:02:55

标签: python pandas python-2.7 sqlite

我有大型数据库,正在使用python中的sql查询将数据写入csv文件。在sql数据库中,每一行都是手指ID的一系列空间信息。我可以参数化查询以获取信息并为每个手指写我需要的文件。但是,在创建功能的for循环时会出现问题,该循环会遍历列表中所有索引的每个ID。

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值之一的示例。我需要它仅对“ rt100”的[44,48,50,55,56,57]和“ rt101”的[49,54,57,61,62,64]进行迭代。当前,它正在遍历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' 

每个FINGER中的每个INDEX。

1 个答案:

答案 0 :(得分:0)

问题在这里:

  

但是,对于每个FINGER值,它都会遍历整个INDEX列表

它是由以下循环引起的:

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

在这种情况下,将对whateverFINGER中值的所有组合执行INDEX。如果每个都有N个值,则whatever行将执行N*N次。

但是您希望它仅对其中一些执行,即给定FINGER = [f1, f2, ..., fN]INDEX = [i1, i2, ..., iN],对于值N,{{1},应该精确地(f1, i1)个迭代},...,(f2, i2)

为此,请更改循环:

(fN, iN)