2013-06-18 49 views
2

我有一個列表prodemployees,看起來像這樣:的Python:拆分列表動態

['prd1 employe4 employe2', ' prd2 employe2'] 

我需要這個名單的值來動態地創建一個查詢的「凡」的聲明,我所需要的輸出是這樣的:

WHERE (product = 'prd1' AND employe IN ('employe4','employe2')) 
OR 
(product = 'prd2' AND employe IN ('employe2')) 

我HAE試過空格分割的列表中的每個值,並創建包含結果值的子列表,但在使用這些值失敗。

我是新來的Python,任何幫助表示讚賞。

splitOnSpace = [] 
for i in range(len(prodemployees)) : 
    splitOnSpace = prodemployees[i].split() 
    for j in range(len(splitOnSpace)) : 
     #this is where I should do something with splitOnSpace[j] I guess... 
+1

是'prd2 employe2'故意開始的空間嗎? – Don

+3

不要在'range()'中使用'for i,列表上的直接循環會執行。 –

+0

noo的空間不是故意的 – salamey

回答

7

你有分裂後的列表,你可以,列出得到一個子列表:

for prod_emp in prodemployees: 
    prod_emp = prod_emp.split() 
    prod, emp = prod_emp[0], prod_emp[1:] 

這裏prod設爲您的分割字符串的第一個元素,emp到列表除了第一個元素:

>>> prodemployees = ['prd1 employe4 employe2', ' prd2 employe2'] 
>>> for prod_emp in prodemployees: 
...  prod_emp = prod_emp.split() 
...  prod, emp = prod_emp[0], prod_emp[1:] 
...  print prod, emp 
... 
prd1 ['employe4', 'employe2'] 
prd2 ['employe2'] 

從這裏開始,我會使用SQL參數來執行實際查詢。構建過濾器,然後通過在各分割參數的鏈作爲一個長參數列表:

from itertools import chain 

filters = filters = ('(product=%s AND employee in ({}))'.format(', '.join('%s' for _ in range(len(pe.split()) - 1))) for pe in prodemployees) 
cursor.execute('SELECT * FROM sometable WHERE {}'.format(
        ' OR '.join(filters)), 
       chain.from_iterable(pe.split() for pe in prodemployees)) 

這裏filters生成帶有參數佔位符合適的SQL:

>>> filters = ('(product=%s AND employee in ({}))'.format(', '.join('%s' for _ in range(len(pe.split()) - 1))) for pe in prodemployees) 
>>> list(filters) 
['(product=%s AND employee in (%s, %s))', '(product=%s AND employee in (%s))'] 
>>> filters = ('(product=%s AND employee in ({}))'.format(', '.join('%s' for _ in range(len(pe.split()) - 1))) for pe in prodemployees) 
>>> 'SELECT * FROM sometable WHERE {}'.format(
...                    ' OR '.join(filters)) 
'SELECT * FROM sometable WHERE (product=%s AND employee in (%s, %s)) OR (product=%s AND employee in (%s))' 

.execute()將填補到從查詢該chain.from_iterable()提供的參數:

>>> list(chain.from_iterable(pe.split() for pe in prodemployees)) 
['prd1', 'employe4', 'employe2', 'prd2', 'employe2'] 

%s佔位符用她e特定於某些類型的數據庫適配器;其他人可以用?代替;檢查數據庫適配器文檔。

+0

感謝您的努力!我忘記提及我以前不知道'prodemployees'的長度,第二個「AND」的數量應該根據prodemployees的長度動態添加......我怎樣才能以編程方式進行此操作? – salamey

+0

讓我們讚不絕口。比Martijn Pieters更有知識和更有幫助,這是一個很好的答案。 – dawg

+0

當我這樣做:'打印( 'SELECT * FROM CR其中{}' 格式( '或'。加入(過濾器)),chain.from_iterable(pe.split()在prodemployees PE)。)'它給了我: '('SELECT * FROM CR WHERE(product =%s AND employee in(%s))',)爲什麼不顯示值? – salamey