我可以在python中同时进行变量赋值和列表插入吗?

时间:2016-06-28 17:47:15

标签: python python-2.7

上下文:我想指定我希望我的脚本制作的一堆目录的名称。我想将这些路径名称声明为变量并将它们添加到列表中,我将迭代它以创建目录。 Python 2.7.5。

我正在尝试以下方法:

dir_list = [
(dir_1 = "<path_to_dir_1>")
(dir_2 = "<path_to_dir_2>")
]

我得到了:

    (dir_1 = "<path_to_dir_1>"),
           ^           
SyntaxError: invalid syntax

如果我这样做:

dir_1 = "<path_to_dir_1>"
dir_2 = "<path_to_dir_2>"
dir_list = [dir_1, dir_2]
print dir_list

没有错误,它可以正常工作。

我搜索过但没有找到这个问题的答案,不过我确实找到了如何在Python中格式化多行词典的答案:What is the proper way to format a multi-line dict in Python?

PEP8样式指南也提供了有关如何格式化多行列表的指导:https://www.python.org/dev/peps/pep-0008/#indentation

但是,我还没有找到答案,我是否可以将变量赋值和列表包含分解为一步。

6 个答案:

答案 0 :(得分:1)

我认为简短的答案是否定的。在Python 2.7中,assignment statement是一个语句,因此不能包含在list element的上下文中。可能有一种方法可以将列表解压缩到其他变量中,但并不像您所说的那样。我期待真正的Python专家权衡:)。

答案 1 :(得分:1)

没有。赋值不是表达式(它不会对任何内容求值),因此您无法同时将变量插入到列表中。

答案 2 :(得分:1)

这是不可能的,因为您尝试做的事情将被视为assignment

Python evaluates expressions from left to right. Notice that while evaluating an assignment, the right-hand side is evaluated before the left-hand side.

来自5.14 Evaluation order

这样,分配操作数=右侧的每个表达式都将在左侧之前进行评估,而您的正式表达式为syntax error

答案 3 :(得分:1)

如果没有完整的情况,我的首选是保持简单。

dir_1 = '<path_to_dir_1>'
dir_2 = '<path_to_dir_2>'
dir_list = [dir_1, dir_2]
print dir_list

然而,正如你明确拒绝了这一点,我的下一个选择是dict

dir_dict = dict(
    dir_1='<path_to_dir_1>',
    dir_2='<path_to_dir_2>',
)
print dir_dict.values()

你似乎也不喜欢dicts,所以我会提供滥用locals()的怪物,但我强烈反对它。

dir_1 = '<path_to_dir_1>'
dir_2 = '<path_to_dir_2>'
dir_list = [path for name, path in locals().items() if name.startswith('dir_')]
print dir_list

Python完全是关于简单(和词典)的,所以我说要拥抱它们。

最后一种选择:您可以创建一个允许对其键进行属性访问的字典子类。这意味着路径名称周围的引号更少。

class PathCollection(dict):
    def __init__(self, *args, **kwds):
        super(PathCollection, self).__init__(*args, *kwds)
        self.__dict__ = self

paths = PathCollection()
paths.dir_1 = '<path_to_dir_1>'
paths.dir_2 = os.path.join(paths.dir_1, '<relative_to_path_dir_2>')
print paths.values()

答案 4 :(得分:0)

你可以用dict处理它:

dir_list = [
    {"dir_1" : "<path_to_dir_1>",
     "dir_2" : "<path_to_dir_2>"}
]

如果它必须使用列表,你就不能像你那样声明变量,你只能这样做:

dir_list = ["<path_to_dir_1>", "<path_to_dir_2>"]

答案 5 :(得分:0)

您的代码令人困惑,但我认为您不需要dict,您只需要一个路径列表,如下所示:

dir_list = ['c:/users/me/hi', 'c:/users/you/hi', ...]

然后你可以迭代它:

for path in dir_list:
    os.mkdir(path) #or os.mkdirs(path), check the usage

如果要为每个路径命名,可以使用dict:

dir_dict = {'me': 'c:/users/me/hi', 'you': 'c:/users/you/hi'...}

然后您可以通过键名迭代:

for name in dir_dict.keys():
    path = dir_dict[name]
    os.mkdir(path)

然后你可以用某种方式加入这些名字。

编辑:例如,如果你想从这样的源构建:

source = [('name', 'c:/path/%s'), ('you', 'c:/otherpath/%s'), ('him', 'c:/yetanotherpath/%s')]

dir_paths = dict()
for elem in source:
    dir_paths[elem[0]] = elem[1] % (elem[0])

dir_paths
> {'him': 'c:/yetanotherpath/him',
   'name': 'c:/path/name',
   'you': 'c:/otherpath/you'}

我不清楚你是如何建立你的路径和名字列表的 - 是否有一些过程,或者你只是在输入一堆?