将参数传递给zip()作为字符串,避免使用exec()

时间:2013-04-05 14:52:20

标签: python python-2.7

我有几个列表,例如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())

2 个答案:

答案 0 :(得分:1)

zip(*[locals()[x] for x in my_arguments.split(',')])之类的东西可能会有用。

如果在全局命名空间中定义了变量,

可能会将locals替换为globals

如果您知道自己只是在处理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中不应包含的内容。

答案 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(',')])

虽然。