2013-04-05 55 views
1

我有幾個列表,例如A,B,C,D,E,我希望根據用戶輸入以各種方式使用zip , 例如。將參數傳遞給zip()作爲一個字符串,避免使用exec()

output_list = zip(A,C,D) 
output_list = zip(A,D,E,B) 
output_list = zip(C,D) 

我需要傳遞的參數爲一個字符串,我相信能可能就通過getattr(),例如,像這樣:

my_arguments = 'A,C,D' #string 
output_list = getattr(zip, my_arguments) 

,我發現了錯誤

'builtin_function_or_method' object has no attribute 'raw,dd,utm' 

我吠叫正確的樹嗎? (我不想使用exec())

回答

1

類似zip(*[locals()[x] for x in my_arguments.split(',')])可能會工作。

如果變量是在全局名稱空間中定義的,則可能將其替換爲localsglobals

如果你知道你只是鑼被處理ABC ...,你可以收拾他們到字典提前:

namespace = {'A':A, 
      'B':B, 
      'C':C, 
      } 
zip_args = [namespace[x.strip()] for x in my_arguments.split(',')] 
output = zip(*zip_args) 

這僅僅是一個更我說過你可以在上面做的(它使用locals()字典作爲名稱空間映射)的明確版本。因爲這是最明確的版本,所以我會使用...然後你不必擔心用戶在某種程度上包含output他們不應該做的事情。

+0

偉大的答案謝謝。 – Ninga 2013-04-05 15:35:16

1

你可以這樣做:

def zipper(args): 
    A = [1, 2] 
    B = [3, 4] 
    C = [5, 6] 

    lists = locals() 
    return zip(*map(lambda var: lists[var], args.split(','))) 


print zipper('A,B') 
print zipper('B,C') 

但你可能不應該有這些列表作爲獨立變量。字典可能是清潔:

lists = { 
    'A': [...], 
    'B': [...] 
} 

你仍然會使用

zip(*map(lambda var: lists[var], my_arguments.split(','))) 

zip(*[lists[var] for var in my_arguments.split(',')]) 

雖然。

+0

這也適用。我喜歡它,對不起,我也無法勾選這個答案。 – Ninga 2013-04-05 15:37:15