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

2024-04-16 10:00:47 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 字符串用户列表output参数stringmy错误
2条回答

zip(*[locals()[x] for x in my_arguments.split(',')])这样的东西可能有用。你知道吗

如果变量是在全局命名空间中定义的,则可能将locals替换为globals。你知道吗

如果您知道您只需要处理ABC…,您可以提前将它们打包到dict中:

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

这实际上只是我上面所说的您可以做的事情的一个更明确的版本(它使用locals()字典作为名称空间映射)。因为这是最明确的版本,所以我会用它。。。那么您就不必担心用户在output中包含了他们不应该包含的内容

您可以这样做:

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

不过。你知道吗

相关问题 更多 >