我有几个列表,例如A,B,C,D,E,我想根据用户输入以各种方式使用zip()进行组合,例如。
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())
答案 0 :(得分:1)
zip(*[locals()[x] for x in my_arguments.split(',')])
之类的东西可能会有用。
可能会将locals
替换为globals
。
如果您知道自己只是在处理A
,B
,C
...,那么您可以提前将它们打包成字典:
namespace = {'A':A,
'B':B,
'C':C,
}
zip_args = [namespace[x.strip()] for x in my_arguments.split(',')]
output = zip(*zip_args)
这实际上只是我上面说的可以做的更明确的版本(使用locals()
字典作为命名空间映射)。由于这是最明确的版本,所以我会使用它......那么你不必担心用户会以某种方式包含output
中不应包含的内容。
答案 1 :(得分: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(',')])
虽然。