2017-10-15 52 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