2017-03-24 40 views
0

爲了澄清,我正在從一個文件中讀取並將每行發送到一個函數(1),其中相關的元素被放入一個列表中。然後將該列表發送到另一個函數(2)並添加到字典中,該列表中的一個元素是關鍵字,其他元素放在另一個列表中,即值。所以,基本上{key:(value(,value))。如何在每個連續的函數調用中保留字典的元素?

問題是,每當我發送從(1)到(2)的列表時,新創建的字典將被覆蓋。我是Python的新手,但我很確定我可以將多個鍵和值添加到一個字典中嗎?那麼,是否有一種方法可以在每次(2)被調用時保存字典的元素?所以,如果它被調用一次,它在詞典中就有令牌(a)。當它再次被調用時,它仍然有令牌(a),現在令牌(b)被添加,等等。

如果你需要代碼,我可以包括它。

MCVE:

def file_stuff(file name): 
    #opens and reads file using with x open as thing....then 
    for line in thing: 
     function1(line) 


def function1(line): 
    #Breaks down line using regex; variable name var for this example 
    #list the relevant components of the line will go into 
    element = list() 

    for x in var: 
     list.append(x) 

    function2(element) 


def function2(element): 
    #Another list is made along with a dictionary 
    webster = dict() 
    values = list() 

    for x in range(len(element)): 
     #inserts into dictionary.....the problem being, however, that I need this dictionary to "remember" what was already stored inside 
+2

嘗試創建[mcve](https://stackoverflow.com/help/mcve),它解釋您的問題並將其發佈到此處。幫助我們幫助你... – alfasin

+0

我提供的psuedocode足夠了嗎? – KalBaratheon

回答

1

在你當前的代碼,websterfunction2一個局部變量被綁定到一個字典。然而,你永遠不會return或做任何其他的字典,讓該函數外的代碼看到它,所以當函數結束時,沒有進一步引用字典,它將被垃圾收集。

如果您希望每次調用function2以使用相同的字典,則需要更改該函數以便它以不同的方式訪問字典。確切地說最好的方法取決於你的程序的更大設計。

一個選項是使webster成爲一個全局變量,其中function2可以就地修改。這很容易做到,但它有一些非常嚴格的限制,因爲模塊只有一個全局名稱空間。處理多個應將數據放入多個不同字典的文件將非常困難。

這將是這個樣子:

webster = {} 

def function2(element): 
    ... 
    webster[some_key] = some_value 

另一種選擇是讓字典的函數參數,所以調用代碼負責創建和保持對它的引用在調用之間。這可能是一個比使用全局變量更好的方法,但是我很難演示,因爲我不清楚字典應該在哪個例子中生存(可能在function1,或者它可能需要一直通過從file_stuff)。

它看起來是這樣的:

def caller(): 
    the_dict = {} 

    for item in some_sequence(): 
     function2(item, the_dict) 

def function2(item, webster) 
    ... 
    webster[some_key] = some_value 

最後的選擇是有function2仍然是負責創建的字典,但爲了能return字典中它的調用者,誰可以做什麼用它(比如將其內容與以前調用的字典進行合併)。我甚至不會試圖證明這一點,因爲合併過程將很大程度上取決於你在字典中的內容。 (一個相關的選項可能會返回一些其他非字典值(或值的元組),然後可以通過調用代碼將其插入字典中,這可能比在某些情況下處理中間字典更容易。)

+0

很好解釋。 – bernie

+0

感謝您的廣泛響應。我會全力以赴 – KalBaratheon

相關問題