2015-11-07 49 views
1

我正在使用如下所示的列表生成器。我想知道如何將不同的文本或值分配給各個列表生成器。在示例代碼中,我只能一次爲所有列表生成器分配值。例如,我想爲vrow1[3]="value 1"分配k,row1[3]="value 2"m,row1[3]="value 3".我該如何實現這個目標?將不同的值分配給列表生成器結果

v = (item for item in propadd if item[0]==row1[8] and harversine(custx,custy,item[2],item[3])<1500) 
k = (item for item in custadd if item[0]==row1[4]) 
m = (item for item in numlist if re.search(r"^[0-9]+(?=\s)",row1[0]) is not None and item[0]==re.search(r"^[0-9]+(?=\s)",row1[0]).group()) 
for gen in (v, k, m): 
    l = list(gen) 
    if len(l) == 1: 
     row1[1] = l[0][1] 
     row1[2] = l[0][2] 
     break 

回答

1

有幾種不同的方式爲不同的發生器分配附加值。最簡單的方法是創建一個由生成器鍵入的字典或一個包含值的相同長度的迭代器。這兩種方法如下所示:

可迭代

v = (item for item in propadd if item[0]==row1[8] and harversine(custx,custy,item[2],item[3])<1500) 
k = (item for item in custadd if item[0]==row1[4]) 
m = (item for item in numlist if re.search(r"^[0-9]+(?=\s)",row1[0]) is not None and item[0]==re.search(r"^[0-9]+(?=\s)",row1[0]).group()) 
extraValues = ('value 1', 'value 2', 'value3') 
for ind, gen in enumerate((v, k, m)): 
    l = list(gen) 
    if len(l) == 1: 
     row1[1] = l[0][1] 
     row1[2] = l[0][2] 
     row1[3] = extraValues[ind] 
     break 

字典

v = (item for item in propadd if item[0]==row1[8] and harversine(custx,custy,item[2],item[3])<1500) 
k = (item for item in custadd if item[0]==row1[4]) 
m = (item for item in numlist if re.search(r"^[0-9]+(?=\s)",row1[0]) is not None and item[0]==re.search(r"^[0-9]+(?=\s)",row1[0]).group()) 
extraValues = {v: 'value 1', 
       k: 'value 2', 
       m: 'value3') 
for gen in (v, k, m): 
    l = list(gen) 
    if len(l) == 1: 
     row1[1] = l[0][1] 
     row1[2] = l[0][2] 
     row1[3] = extraValues[gen] 
     break 

你也可以有地方可以用比其他一些功能來產生額外價值的一些複雜場景字典查找或元組索引。

+0

這工作完美,並顯着提高性能。謝謝!! – ketar

+0

你最終使用了哪一個? –

+0

兩者的速度似乎差不多,所以我隨字典一起去了,因爲我對它更熟悉,如果需要,我可以更容易地分配更多不同的值。 – ketar