2017-10-15 35 views
-1

我想通過python字典循環查看我從csv文件中獲取的值是否已經存在於字典中,如果這些值不存在,我想添加他們到字典。然後將其附加到列表中。python循環通過字典,看看值是否存在

我得到的錯誤列表索引必須是整數,而不是str。

例如輸入

名字姓

約翰·史密斯

約翰·史密斯

例如輸出

first_name的約翰姓史密斯

USER_LIST = []

with open(input_path,'rU') as csvfile: 
     reader = csv.DictReader(csvfile) 

for row in reader: 

    if row['first_name'] not in user_dictionary['first_name'] and not in row['last_name'] not in user_dictionary['last_name']: 
     user_dictionary = { 

      'first_name':row['first_name'], 
      'last_name':row['last_name'] 
      } 
      user_list.append(user_dictionary) 
+1

請解釋你的代碼。它是如何失敗的。提供樣本輸入,預期輸出和當前錯誤/錯誤輸出,以清楚地顯示問題存在的位置。 – idjaw

+2

在你的第一次迭代中,'user_dictionary'還不存在......在你的後續迭代中,'user_dictionary'引用它的最後一個實例...你是否應該檢查'user_list中的所有*字典'? –

+0

您的縮進還需要修復;作爲發佈,你的'for'循環應該立即退出,並試圖讀取一個關閉的文件(因爲for循環在'with'塊之外)。 – ShadowRanger

回答

0

目前,您的代碼創建的for循環的每個迭代一個新的字典。如果字典的每個值是一個列表,那麼你可以通過關鍵追加到列表:

with open(input_path,'rU') as csvfile: 
    reader = csv.DictReader(csvfile) 
user_dictionary = {"first_name":["name1, "name2", ...], "last_name":["name3", name4", ....]} 
for row in reader: 
    if row['first_name'] not in user_dictionary['first_name'] and not in row['last_name'] not in user_dictionary['last_name']: 
     user_dictionary["first_name"].append(row['first_name']) 
     user_dictionary['last_name'].append(row['last_name']) 
0

一般情況下,你可以使用一個成員資格測試(x in y)上dict.values()以檢查是否值已經存在你的字典。

但是,如果您嘗試將CS​​V文件中的所有唯一身份用戶添加到用戶列表中,這與字典值測試無關,而是列表成員資格測試。

而是在整個列表每次迭代一個緩慢的成員資格檢查,你可以使用添加到列表中的set將包含所有用戶的「IDS」和實現快速O(n)(攤銷)時檢查:

with open(input_path,'rU') as csvfile: 
    reader = csv.DictReader(csvfile) 

user_list = [] 
user_set = set() 
for row in reader: 
    user_id = (row['first_name'], row['last_name']) 
    if user_id not in user_set: 
     user = { 
      'first_name': row['first_name'], 
      'last_name': row['last_name'], 
      # something else ... 
     } 
     user_list.append(user) 
     user_set.add(user_id) 
+0

如果你真的想要...''user_list = [{'first_name':fn,'last_name':ln} for fn,ln in {(row ['first_name'],row ['last_name'])for row in reader }]'... –

+0

這是一個不錯的快捷方式,但它使得更多的(如果不是不可能的話)將其他屬性添加到'user'字典/列表(除了名和姓)。 – randomir

+0

嗯,你可以做'list({(row ['first_name']:row ['last_name']):row in reader} .values())'並且讓你想要的值代替整個行 - 但是,它會保留密鑰的最後一次出現,而不是第一次可能是重要的... –

0

錯誤"list indices must be integers, not str"使問題明確:在引發錯誤的行上,您有一個您認爲是字典的列表。您嘗試使用一個字符串作爲它的關鍵,並繁榮!

您不能提供足夠的信息來猜測它是哪個字典:它可能是user_dictionary,可能是因爲您使用的是csv.reader而不是csv.DictReader,正如您所說的那樣。它甚至可能是其他的東西 - 沒有告訴你還有什麼你遺漏了你的代碼。但它是一個你使用的列表,就好像它是一個字典。

+0

對不起,我以爲我把這在我編輯我的問題時,錯誤與用戶字典有關 – johnsmith

+0

在顯示的代碼中,您將其初始化爲字典。但它似乎將其初始化爲一個列表。 – alexis

+0

...它似乎**你首先**將它初始化爲一個列表:-( – alexis