2015-08-08 103 views
1

我使用的命令行參數作爲用戶輸入...如何避免在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''」。請複製粘貼我們可以運行的確切程序,並將您看到的輸出以及您期望看到的輸出包括在內。 –

回答

0

問題是字典鍵是唯一的,因此任何後續分配相同的密鑰將取代而不是添加到的字典值。你需要的是對關鍵五月匹配值的列表。

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

0

你可以簡單地做如下:

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