2015-01-21 88 views
-1

我的代碼如下所示打開一個csv並將其放入一個字典中,列爲列表。有重複的密鑰,並且不能更改。關鍵是帳號列是行[1]。現在,如果在行[8]中找到'CITY'字符串,則該鍵和值將被刪除。我該如何寫這個,以便同一個鍵(和相應的值)的所有其他實例也將被刪除?Python Dictionary Pop

with open('c:\\file.csv', 'rb') as f: 
    reader = csv.reader(f) 
    result = collections.defaultdict(list) 
    for row in reader: 
     key = row[1] 
     result[key].append([row[0], row[2], row[3], row[4], row[5], row[6], row[7], row[8], row[9], row[10], row[11], row[12]]) 

     if 'CITY' in row[8]: 
      result.pop(key) 

下面是一個輸入例如:

3929, 56794, 5555551212, August, IL, 62305, Steve, Johnson, City, Max, Folder, 22, 56 
3929, 56794, 5555551212, August, IL, 62305, Steve, Johnson, None, Max, Folder, 22, 85 
3929, 58586, 5555551212, August, IL, 62305, Steve, Johnson, None, Max, Folder, 22, 69 

這裏是輸出,我想:

3929, 58586, 5555551212, August, IL, 62305, Steve, Johnson, None, Max, Folder, 22, 69 

如此以來,「城市」的第一行中發現,兩者的具有56794帳號的行將被刪除。

+0

有沒有這樣的事情作爲與「重複鍵」字典。如果你不想要包含這個特定的行,那麼爲什麼不早些做'if'測試,如果CITY存在,不要做附加操作? – BrenBarn 2015-01-21 06:41:28

+0

對不起,csv中的每一行都變成了字典。然後,幾個字典中的一些鍵是重複的。如果我先前做了「if」測試,它將只會刪除包含'CITY'字符串的行。我需要擺脫那一行,然後所有其他行都包含相同的帳號。 – Christopher 2015-01-21 06:44:28

+1

您的代碼不會顯示每行成爲字典。它顯示了一個字典,每行的一個元素被用作關鍵字,並且具有該關鍵字的所有條目都會累積到列表中。您的代碼確實會刪除共享該密鑰的所有項目,但如果以後有其他行使用該密鑰,則它們將不會被「刪除」,因爲它們在刪除它們時尚未出現。如果您可以將樣本數據包含在預期的輸出中,這將會很有幫助。 – BrenBarn 2015-01-21 06:48:22

回答

1

如果我正確理解你,你想要一個密鑰被刪除,如果它的任何行在第8位包含「城市」。在這種情況下,我認爲你可能會更好地跟蹤這些「不需要」的密鑰,這樣的事情:

with open('c:\\file.csv', 'rb') as f: 
    reader = csv.reader(f) 
    result = collections.defaultdict(list) 
    unwantedKeys = set() 
    for row in reader: 
     key = row[1] 
     if 'CITY' in row[8]: 
      unwantedKeys.add(key) 
      if key in result: 
       result.pop(key) 
     if key not in unwantedKeys: 
      result[key].append([row[0], row[2], row[3], row[4], row[5], row[6], row[7], row[8], row[9], row[10], row[11], row[12]]) 

的想法是保持一個列表(或者,在這個例子中,一組)鍵要排除。如果您遇到想要排除的新密鑰,請將其添加到該組並刪除匹配的結果(如果有)。如果您遇到一行其關鍵字位於排除集中的行,那麼您根本就不會將該行添加到結果中。