创建一个表作为范围sqlite3的组合

时间:2017-12-08 14:14:42

标签: python sqlite

我正在尝试创建一个包含3个范围组合的表。

范围1和范围2相等。

范围3不同且长度不同。

对于任何给定的行,第1列中的值不能等于第2列中的值。

e.g。范围1:[1-2],范围2:[1-2],范围3:[5-7]

预期结果将是:

col1 | col2 | col3 |
1    | 2    | 5    |
1    | 2    | 6    |
1    | 2    | 7    |
2    | 1    | 5    |
2    | 1    | 6    |
2    | 1    | 7    |

我正在使用python sqlite3包,所以我可以在python中使用范围。以前我一直使用生成器构建表,该生成器迭代3个嵌套范围,如下所示:

def all_the_combos():
    for x in range(1,len(all_x)+1):
        for y in range(1,len(all_x)+1):
            if x == y:
                continue
            for z in range(min(all_z),max(all_z)+1):
            yield (x, y, z) 

cur.execute('BEGIN TRANSACTION')
cur.executemany('INSERT into All_Combos (x, y, z) Values (?, ?, ?)', all_the_combos())

然而,对于大范围来说这是缓慢的,我希望有一些聪明的方法来使用可以提供更好性能的连接。任何建议都表示赞赏。

1 个答案:

答案 0 :(得分:0)

下面怎么样。你需要熊猫模块。如果你没有熊猫执行" pip install pandas"在运行此代码之前。

import sqlite3
import pandas as pd
from itertools import product

# your sample data
col1 = range(1,3)
col2 = range(1,3)
col3 = range(5,8)

# product -> dataframe -> sqlite3
con = sqlite3.connect("/path/to/sqlite3.db")
df = pd.DataFrame(
    row for row in product(col1, col2, col3)
        if not row[0]==row[1]
)
df.to_sql("output_table_name", con)