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

Posted

技术标签:

【中文标题】我可以在 python 中同时进行变量赋值和列表插入吗?【英文标题】:Can I do a variable assignment and list insertion at the same time in python? 【发布时间】:2016-10-31 04:19:20 【问题描述】:

上下文:我想指定我希望我的脚本创建的一堆目录的名称。我想将这些路径名声明为变量并将它们添加到一个列表中,我将对其进行迭代以创建目录。 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

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

【问题讨论】:

该列表消除了对变量的所有需求。只需使用列表。 【参考方案1】:

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

【讨论】:

【参考方案2】:

没有。赋值不是一个表达式(它不计算任何东西),所以你不能同时赋值给一个变量插入到一个列表中。

【讨论】:

【参考方案3】:

这是不可能的,因为您尝试执行的操作将被视为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

【讨论】:

【参考方案4】:

如果没有你的情况的完整背景,我的偏好是保持简单。

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

但是,由于您明确拒绝了这一点,我的下一个选择是字典

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()

【讨论】:

【参考方案5】:

你可以用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>"]

【讨论】:

【参考方案6】:

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

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

如果你想命名每条路径,你可以使用字典:

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'

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

【讨论】:

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

以上是关于我可以在 python 中同时进行变量赋值和列表插入吗?的主要内容,如果未能解决你的问题,请参考以下文章

python学习总结,python的变量类型

几点技巧让你的 python 代码更加 pythonic

python 列表切片赋值

AI基础_Day05

python如何把输出的字符串赋值给变量

Python3学习笔记--数据类型:字符串列表元组数字字典集合