如何避免在python中覆盖全局字典中的键?
问题描述:
我使用的命令行参数作为用户输入...如何避免在python中覆盖全局字典中的键?
from datetime import timedelta, datetime
import csv, argparse
from collections import defaultdict
parser = argparse.ArgumentParser()
parser.add_argument("-p", dest='prodfile', action="append", help="file names for prod")
args = parser.parse_args()
files_d={}
files_d[""]=[]
if args.testfile:
testfile = args.testfile
type_file="test"
files_d[type_file]=testfile
if args.prodfile:
prodfile = args.prodfile
type_file="prod"
files_d[type_file]=prodfile
print files_d
如何避免所有字典重写[type_file]?
编辑的核心问题是如何积累是共享同一个密钥(在这种情况下值的列表,type_file
是testfile
和prodfile
都需要在列表中累积的重复键。
答
问题是字典键是唯一的,因此任何后续分配相同的密钥将取代而不是添加到的字典值。你需要的是对关键五月匹配值的列表。
一个collections.defaultdict与列表()工厂函数应该满足您的需求:
from collections import defaultdict # <== new code
files_d = defaultdict(list) # <== new code
files_d[""]=[]
if args.testfile:
testfile = args.testfile
type_file="test"
files_d[type_file].append(testfile) # <== new code
if args.prodfile:
prodfile = args.prodfile
type_file="prod"
files_d[type_file].append(prodfile) # <== new code
好运。希望这可以解决您关于[type_file]
覆盖值(替换它们)的问题,而不是附加到匹配值列表。
+0
它仍然覆盖所有的键,以便他们都说“prod”,我确定它与type_file =“prod”在if语句内的事实有关。你知道我如何解决这个问题吗?这样我就不会压倒一切,只是追加了? – Luis
答
你可以简单地做如下:
if args.testfile:
testfile = args.testfile
type_file="test"
if files_d.get(type_file):
files_d[type_file].append(testfile)
else:
files_d[type_file] = list(type_file)
if args.prodfile:
prodfile = args.prodfile
type_file="prod"
if files_d.get(type_file):
files_d[type_file].append(testfile)
else:
files_d[type_file] = list(type_file)
print files_d
这是非常不清楚。你担心压倒性的是什么?您只需设置“测试”和“产品”键,并且不要覆盖任何内容。 –
什么是**所有**词典?只有'files_d',不是吗? –
您的程序产生“'AttributeError:'Namespace'对象没有属性'testfile''”。请复制粘贴我们可以运行的确切程序,并将您看到的输出以及您期望看到的输出包括在内。 –