如何避免在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_filetestfileprodfile都需要在列表中累积的重复键。

+5

这是非常不清楚。你担心压倒性的是什么?您只需设置“测试”和“产品”键,并且不要覆盖任何内容。 –

+1

什么是**所有**词典?只有'files_d',不是吗? –

+0

您的程序产生“'AttributeError:'Namespace'对象没有属性'testfile''”。请复制粘贴我们可以运行的确切程序,并将您看到的输出以及您期望看到的输出包括在内。 –

问题是字典键是唯一的,因此任何后续分配相同的密钥将取代而不是添加到的字典值。你需要的是对关键五月匹配值的列表。

一个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