1

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

4

2 回答 2

1

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

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

如果您知道您只是要处理A, B, C...,您可以提前将它们打包到 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他们不应该包含的内容。

于 2013-04-05T14:56:27.167 回答
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(',')])

尽管。

于 2013-04-05T14:56:59.913 回答