【问题标题】:Delete a specific value from multi-value dictionary in python从python中的多值字典中删除特定值
【发布时间】:2015-07-19 03:52:57
【问题描述】:

``我有一个这样的python字典。

dictionary = {"00":[1,2,3,4,5,6,7,8,9],"01":[1,2,3,4,5,6,7,8,9],"02":[1,2,3,4,5,6,7,8,9],"03":[1,2,3,4,5,6,7,8,9],"04":[1,2,3,4,5,6,7,8,9]........up-to "99":[1,2,3,4,5,6,7,8,9]}

我必须从“00”列表中删除值2。我使用以下语句进行了尝试。

 del (dictionary[key][dictionary[key].index(sudokumatrix[i][iindex])]).

这里键的值为“00”,sudokumatrix[i][iindex] 的值为 2。但我得到的结果字典为

{"00":[1,3,4,5,6,7,8,9],"01":[1,3,4,5,6,7,8,9],"02":[1,3,4,5,6,7,8,9],"03":[1,3,4,5,6,7,8,9],"04":[1,3,4,5,6,7,8,9].....}.

我必须得到结果:

{"00":[1,3,4,5,6,7,8,9],"01":[1,2,3,4,5,6,7,8,9],"02":[1,2,3,4,5,6,7,8,9],"03":[1,2,3,4,5,6,7,8,9],"04":[1,2,3,4,5,6,7,8,9]....}

我在这里发布整个代码:

dictionary = dict()
zerotonine = "123456789"
list2 = list(zerotonine)
list2 = [int(i) for i in list2]
sudokumatrix=[]
for p in range(9):
     for q in range(9):
           keyis=str(p)+str(q)
           dictionary[keyis] = list2 


for i in range(9):
     initialinput = [1,2,3,4,5,6,7,8,9]
     list1=list(initialinput)
     list1 = [int(i) for i in list1]
     sudokumatrix.append(list1)

key = "00"

del dictionary[key][dictionary[key].index(sudokumatrix[0][1])]


print dictionary

【问题讨论】:

  • 无法使用 Python 2.7.6 进行复制
  • 您可能应该发布您的整个代码。乍一看,这看起来像是实习,这不是 Python 数组的默认行为。奇怪的是,值会在没有实习的情况下从所有数组中删除。

标签: python dictionary


【解决方案1】:

EDIT == 我猜(因为没有给出dictionary 的生成)==EDIT。 原因是键 '00', '01', ... 的值指向同一个列表。修改其中一个肯定会影响其他的。

尝试使用它来生成您的字典

dictionary = dict((str(x).zfill(2), range(1, 10)) for x in range(100))

你这部分的代码其实没有错,但是使用list.remove()会好很多。

【讨论】:

  • 奇怪的是它们都指向同一个参考。如果他正在生成帖子中显示的列表,则列表应该不同,至少在 Python 2 中。我不确定 Python 3 是否改变了这一点。
  • 为什么奇怪? an_list_instance = range(1, 10); dictionary = dict((str(x).zfill(2), an_list_instance) for x in range(100))
  • 我明白了,但他说 dict 就是这样.. 我猜它不是如何生成的。
  • @AndréFratelli 在 Python 3 中也不会这样做
  • 这真的很奇怪。如果字典是以这种方式手动生成的,则不应该发生这种情况。
【解决方案2】:

问题与指针有关。

替换这个:

dictionary[keyis] = list2 

用这个:

dictionary[keyis] = [int(i) for i in list2]

您正在正确地创建 list2,但是当您进入循环时,Python 不会在每次迭代时都创建一个全新的副本。它创建一个指向原始列表的指针。 Python 看到:

dictionary[keyis] = list2

然后说“哦,list2?我认得这个名字!我已经把它作为内存中的一个对象了!我将通过更新原始副本并将其链接到此处来节省一些空间!任何时候有人想查看它或更新吧,我只处理原版的,一切都会永远很棒!!!”

好吧,也许python解释器没有那么热情,但我喜欢这样想。最终结果是所有字典值都指向原始列表。

【讨论】:

    【解决方案3】:

    如果您不介意删除列表中所有出现的2,您可以使用列表推导:

    dictionary["00"] = [i for i in dictionary["00"] if i != 2]
    

    这将创建一个新列表,并避免更改其他值,因为您的所有 dictionary 值似乎都引用了同一个列表。

    编辑:是的,您的字典值引用了相同的列表

    您可以使用字典和列表理解来创建您的dictionary

    dictionary = {str(x):[i for i in range(10)] for x in range(100)}
    

    【讨论】:

      猜你喜欢
      • 2012-10-07
      • 2021-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-19
      • 1970-01-01
      • 2021-08-19
      相关资源
      最近更新 更多