【问题标题】:Discriminating between keys when updating python dictionary values [duplicate]更新python字典值时区分键[重复]
【发布时间】:2020-11-18 19:23:58
【问题描述】:

可能不重要的上下文:

我有一个将字符串写入文件的脚本。这些字符串从一个主列表开始,被分离到单独的列表中,其中一些然后通过网络爬虫,生成更多字符串,然后将输出写入 fasta 文件。因此,有很多索引检查来协调这些列表之间的输出。

要检查其所有工作是否正常,我想将最终的 fasta 文件与初始主列表进行比较,以检查不同列表之间的索引是否产生了预期的输出。为此,我将 fasta 文件作为big_list 写入,然后重新创建初始主列表。下面的问题是这项工作的一部分。

问题:

我正在尝试根据big_list 的内容更新字典,但我的字典更新正在做一些奇怪的事情。它正在分配值 OK,但它不区分不同的键,因此所有值都作为重复列表分配给每个键。

我首先将脚本前面的键列表 (dict_key_list) 转换为字典:

dict_key_list=[dict_key1_str, dict_key2_str, ...]
dictionary=dict.fromkeys(set(dict_key_list), []) #--> {dict_key1_str:[], dict_key2_str:[], .........}

然后我尝试根据上述big_list 对象更新它。但就像我说的那样,发生了一些奇怪的事情。谁能告诉我什么,而我一直在想它?

#big list format = ['dict_key1_str \t value1_str', 'dict_key1_str \t value2_str',......,'dict_key2_str \t value1000_str','dict_key2_str \t value1001_str',... for more keys]
                   
for list_object_str in big_list:
   
    #break into a list:  'dict_key1 \t value1' --> [dict_key1, value1]
    list_object_list=re.split(r'\t+', list_object_str)
    
    #pull key from list above
    dict_key_str=list_object_list[0]
    
    #pull the value I want to append from list above
    value_add_str=list_object_list[1]
    
    #get whatever value is currently assigned to key - this is a list
    current_dict_value=dictionary[dict_key_str]
    
    #add append value to current value
    current_dict_value.append(value_add_str)
    
    #assign new value to dict key
    dictionary[dict_key_str]=current_dict_value

    #have also tried dictionary.update({dict_key:current_dict_value})

这会将两组值分配给每个键 - 因此从 1 到 999 和 1000 到最终值索引的所有值都作为相同的大列表分配给每个键:

{'dict_key1_str':[value1_str,value2_str,...last_value_str], 'dict_key2_str':[value1_str,value2_str,...last_value_str], ... more keys same value lists}

我真正想要的是:

{'dict_key1_str':[value1_str,value2_str,...value999_str], 'dict_key2_str':[value1000_str,value1001_str,...last_value_key2_str], ... more keys different value lists}

【问题讨论】:

    标签: python-3.x dictionary


    【解决方案1】:

    我没有仔细阅读代码,但乍一看它似乎与引用和不变性有关。例如,

    >>> a = {"foo": "bar"}
    >>> b = a
    >>> b["foo"] = "baz"
    >>> print(a["foo"])
    baz
    

    如您所见,分配并没有改变对象。因此,每次您在列表中调用 append 时,它也会更新对该列表的每个引用。

    尝试改用 dict.update(),

    my_dict.update({key: my_dict.get(key, []) + value_to_append})
    

    【讨论】:

    • 您好 Dingobar,感谢您的回复。你是对的,基于上面的链接,我基本上为我的所有值获得了相同的列表对象,所以当我试图改变一个(据我所知)时,它们都被引用了。您的解决方案不起作用(除非我在输入实际变量名时写错了)。我认为这是因为它专注于循环内的引用(即“当前值”),而不是字典对象之间的引用。虽然也许它工作正常,但我做错了,就像我说的那样:P
    猜你喜欢
    • 2018-11-11
    • 2021-10-07
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    • 2019-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多