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

我可以在python中同时执行变量赋值和列表插入吗?,python,python-2.7,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>"), ^ SyntaxErro

上下文:我想指定我希望脚本生成的一组目录的名称。我想将这些路径名声明为变量,并将它们添加到一个列表中,我将迭代该列表以生成目录。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中格式化多行词典的答案:

PEP8样式指南还提供了关于如何设置多行列表格式的指导:


但是,对于是否可以将变量赋值和列表包含合并为一个步骤,我还没有找到答案。

我认为简短的答案是否定的。在Python 2.7中,an是一个语句,因此不能包含在a的上下文中。可能有一种方法可以将列表解压到其他变量中,但并不完全像您所说的那样。我期待着真正的Python专家加入进来:。

不。赋值不是一个表达式,它不会对任何内容求值,因此您不能同时赋值给变量并插入列表。

您可以处理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>"]

这是不可能的,因为您试图做的事情将被视为一项任务:


因此,赋值操作数=右侧的每个表达式都将在左侧之前求值,而您的表达式在形式上是一个语法错误。

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

dir_list = ['c:/users/me/hi', 'c:/users/you/hi', ...]
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'}
然后您可以对其进行迭代:

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)
然后你可以用某种方式把这些名字合并在一起

编辑:例如,如果您希望从以下源生成:

dir_list = ['c:/users/me/hi', 'c:/users/you/hi', ...]
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'}

我不清楚您是如何建立路径和名称列表的-是否有一些过程,或者您只是键入了一堆?

如果没有您的情况的完整上下文,我倾向于保持简单

dir_1 = '<path_to_dir_1>'
dir_2 = '<path_to_dir_2>'
dir_list = [dir_1, dir_2]
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()

该列表消除了对变量的所有需要。你说得对,我不需要口述,这就是为什么我不做口述的原因。我确实希望目录具有可变名称-如果稍后有人出现并希望更改逻辑上仍指向同一资源的目录的磁盘位置,该怎么办?变量名保持逻辑连接,同时允许分配新的物理位置。好处是物理层和逻辑层分离。如果您想命名路径以供将来参考,则需要一个字典。出现语法错误的第一位代码看起来与创建字典完全一样。或者,如果列表维护的顺序对您很重要,您可以使用集合中的ordereddict。如果我使用dict,我可以在插入dict的同时进行赋值吗?所以:dir_dict={'me':'c:/user/me','my stuff':'%s'%me+'/mystuff'}'my stuff'应该计算为:'c:/user/me/mystuff'这就是你的意思吗?我会在我的答案中添加一些内容。键入一组:EDIT:像这样-dir_1=/dir1,dir_2=dir_1+/dir2等等。有很多这样的,它们不都是线性的,否则我会做一个os.makedirs,然后用它来做。
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()