上下文:我想指定我希望我的脚本制作的一堆目录的名称。我想将这些路径名称声明为变量并将它们添加到列表中,我将迭代它以创建目录。 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
但是,我还没有找到答案,我是否可以将变量赋值和列表包含分解为一步。
答案 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.
这样,分配操作数=
右侧的每个表达式都将在左侧之前进行评估,而您的正式表达式为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'}
我不清楚你是如何建立你的路径和名字列表的 - 是否有一些过程,或者你只是在输入一堆?