2016-05-18 128 views
2

我目前正在編寫一些從文本文件中讀取行的代碼。該行被分成3個不同的段,第一段是用戶ID。修改列表中包含的字典

例如,一條線是這樣的:

11 490 5 

我有因爲有用戶一樣多的元素,其中每個元素與用戶對應的第五用戶(例如exampleList[4]存儲數據的列表)。

每個列表元素包含一個不確定長度的字典,其中鍵是該行的第二個段,該值是該行的第三個段。

如果在另一行中出現相同的用戶ID,字典的長度(鍵值對的數量)會增加。這個想法是,當遇到具有相同用戶ID的另一行時,來自該行的數據被附加到對應於該用戶的列表元素的字典中。

例如,上述線路將被存儲在這樣的:

exampleList[10] = {490:5} 

,如果程序讀取另一行是這樣的:11 23 9

列表項將自動更新到這一點:

exampleList[10] = {490:5, 23:9} 

我的程序工作的方式是,它首先收集用戶數量,然後創建一個像這樣的列表:

exampleList = [{}] * numberOfUsers 

然後使用re.finditer提取行中的空白位置,然後通過基本字符串操作提取數字。

該部分完美工作,但我不確定如何更新列表中的字典,即將新的鍵值對添加到字典中。

我讀過關於使用for循環here,但這不適用於我,因爲它將它添加到單元格中的每個字典中,而不是僅將它附加到某個單元格中的字典中。

示例代碼:

oFile = open("file.txt", encoding = "ISO-8859-1") 
    text = oFile.readlines() 
    cL = [{}] * numOfUsers #imported from another method 
    for line in text: 
     a = [m.start() for m in re.finditer('\t', line)] 
     userID = int(line[0:a[0]]) 
     uIDIndex = userID - 1 
     cL[uIDIndex].update({int(line[a[0]+1:a[1]]):int(line[a[1]+1:a[2]])}) 
    print(cL) 

file.txt: 
1 242 3 
3 302 3 
5 333 10 
1 666 9 

expected output: 
[{242:3 , 666:9},{},{302:3},{},{333:10}] 

actual output: 
[{242: 3, 333: 10, 302: 3, 666: 9}, {242: 3, 333: 10, 302: 3, 666: 9}, {242: 3, 333: 10, 302: 3, 666: 9}, {242: 3, 333: 10, 302: 3, 666: 9}, {242: 3, 333: 10, 302: 3, 666: 9}] 

出於某種原因,它填充與所有值的列表中的所有詞典。

+0

請您分享一些您的代碼。 –

+1

如果你想要一個字典列表,你爲什麼要創建一個列表清單? – TessellatingHeckler

+0

你可以加入一些固體樣品和預期產量嗎? –

回答

0

我不是很積極正確理解你的問題,但我能夠得到你想要的輸出。 請注意,此解決方案完全忽略列表中的第四個值

import re 
fileData = [] #data from file.txt parsed through regex 

with open("file.txt") as f: 
    for line in f: 
     regExp = re.match(r"(\d+)\s+(\d+)\s(\d+)", line) #extracts data from row in file 
     fileData.append((int(regExp.group(1)), int(regExp.group(2)), int(regExp.group(3)))) #make 2-d list of data 
maxIndex = max(fileData, key=lambda x: x[0])[0] #biggest index in the list (5 in this case) 

finaList = [] #the list where your output will be stored 
for i in range(1, maxIndex+1): #you example output showed a 1-indexed dict 
    thisDict = {} #start with empty dict 
    for item in fileData: 
     if item[0] == i: 
      thisDict[item[1]] = item[2] #for every item with same index as this dict, add new key-value to dict 
    finaList.append(thisDict) #add this dict to output list 

print(finaList) 
+0

完美!非常感謝你 - 如果我讓問題難以理解,我不是最擅長溝通的。 – user132520

+0

我認爲問題不是你的解釋,我認爲這只是一個複雜的問題,很難在文本中傳達。但是,對我來說理解這個問題是99%的戰鬥,編碼解決方案並不複雜 – Keatinge

0

您可以通過索引訪問字典。這裏有一個簡單的例子:

>>> A = [] 
    >>> A.append(dict()) 
    >>> A.append(dict()) 
    >>> A[0][5] = 7 
    >>> A 
    [{5: 7}, {}] 
    >>> A[1][4] = 8 
    >>> A[0][3] = 9 
    >>> A[1][8] = 10 
    >>> A 
    [{3: 9, 5: 7}, {8: 10, 4: 8}]