Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何避免将相同的str分配给字典中的列表_Python_List_Dictionary - Fatal编程技术网

Python 如何避免将相同的str分配给字典中的列表

Python 如何避免将相同的str分配给字典中的列表,python,list,dictionary,Python,List,Dictionary,我觉得这很难处理 我有一个很大的管道,在它的一小部分中,我执行一个循环,使用我的_dict.setdefaultk1,[].appendv1将值分配为一个列表,但我希望有一个if语句来说明一个键的列表中是否已经存在一个值,然后不要追加它 我的脚本部分是: identifier1={} for k1, v1 in fw1.items(): #find_while_mismatch is a custom def idf1 = find_while_mismatch(v1, my_

我觉得这很难处理

我有一个很大的管道,在它的一小部分中,我执行一个循环,使用我的_dict.setdefaultk1,[].appendv1将值分配为一个列表,但我希望有一个if语句来说明一个键的列表中是否已经存在一个值,然后不要追加它

我的脚本部分是:

identifier1={}

for k1, v1 in fw1.items():
    #find_while_mismatch is a custom def
    idf1 = find_while_mismatch(v1, my_string)  #creates different versions of v1 and does re.search
    if idf1 is not None:  #skip return None
        identifier1.setdefault(k1, []).append(idf1)
我尝试了identifier1=defaultdictset,但它不起作用,列表中的值仍然重复

我用下面的行替换了第3行,但它也不起作用

if idf1 is not None and str(idf1) not in [i for i in identifier1.get(k1)]:
我怎样才能让它工作?谢谢

我认为使用identifier1=defaultdictset+identifier1[k1]可以完成这项工作。事实上,以下代码片段应该可以工作:

从集合导入defaultdict identifier1=defaultdictset 对于fw1.1中的k1、v1项目: idf1=在\u不匹配时查找\u,我的\u字符串 如果idf1不是无: 标识符1[k1]。已添加1 我没有定义fw1的所有信息/变量,查找\u,而\u不匹配。。。所以我试着用一个虚拟的例子:

从集合导入defaultdict fw1={ 键1:[aaa,无,aaa,b], 键2:[a,无,无] } identifier1=defaultdictset 对于fw1.1中的k1、v1项目: 对于v1中的idf1: 如果idf1不是无: 标识符1[k1]。已添加1 打印机识别器1 输出为:

defaultdict(<class 'set'>, {'key1': {'aaa', 'b'}, 'key2': {'a'}})
没有默认的dict 标识符1={} 对于fw1.1中的k1、v1项目: idf1=在\u不匹配时查找\u,我的\u字符串 items=identifier1.getk1,[] 如果idf1不是无且idf1不在项目中: 项目1.1 标识符[k1]=项目
我认为您对.get有问题,因为您没有使用默认值:如果k1不在identifier中,则identifier.getk1的输出为None。在python中,当您在None中执行item时,会得到一个TypeError,因为None是不可编辑的。因此,如果要使用.get,则必须使用空列表作为默认值,例如identifier1.getk1,[]

您确定数据类型为str吗?为什么在检查之前强制转换到str,但将值本身附加到列表中。删除此强制类型转换或在.appendstridf1处添加强制类型转换都应该可以,尽管这不是最佳的fwiw,[i for i in identifier1.getk1]是多余的,可以简化为identifier1.getk1。@deceze您是对的,但当我在identifier1.getk1中添加强制类型转换时,它会打印一个包含所有值的列表。也就是说,如果idf1不在identifier1.getk1中对我没有帮助,只需要添加[i for i in identifier1.getk1]会产生错误->类型错误:“NoneType”对象不是iterable@Apex你可以在M.Perier Dulhoste的回答中看到:没有列表。谢谢你的帮助:,出于学习目的,你能告诉我为什么我的方法没有给出预期的答案吗?当然!在您发布的代码段中,您仅检查该项是否为无。但是,您还必须检查该项是否已在列表中,以确保没有重复项。对于您提到的defaultdictset和使用get的其他方法,我没有任何信息可以告诉您为什么它不起作用。这取决于您是否更改代码段中的其他行。我将更新我的答案,以显示我们如何让它与列表一起工作!那太好了:谢谢你——无论如何,我不知道我的问题为什么会被投票——1,我的问题不是一个真正的问题吗?奇怪:/I我编辑了我的答案以使用列表而不是集合,如果有什么不清楚,请告诉我!我认为你问题的唯一问题是,你提到了你尝试过的东西,但没有提到相应的两个片段,即使有一些小的变化,它总是有用的。我承认仅仅为了这个就否决你的问题有点苛刻