消除python中字典中的重复

时间:2013-08-05 17:44:53

标签: python list dictionary

我正在创建python中的字典,但list和python之间的细线让我很困惑。我拥有的是

values = []

我在哪里将值存储为

values.append({newvalue : oldvalue})

列表或字典无论它是什么,它都在工作,但不检查它们之间的重复。所以我做的是

for i in range(len(values)):
    if ((newvalue not in values[i])):
         values.append({newvalue: oldvalue})

但这不起作用。为什么?我该如何解决这个问题?如果你有时间,请解释列表与字典的不同之处以及我的代码中有什么。列表或字典?

由于

3 个答案:

答案 0 :(得分:2)

首先,如果你想要一个空字典,不要做values = []列表,而不是

values = {}

添加到词典时,请执行此操作

mydict[mykey] = myvalue

在检查键中是否已存在某些内容时执行此操作

if newkey not in mydict:
    print('this will not overwrite anything')

我认为你误解了字典的概念 执行此操作时,key将成为您的词典键,val将成为您的词典值。字典是{key:value}顺序中的一组术语的组合,因此,如果您执行myDict[key],您将获得value


如果你想在确保不覆盖任何内容的同时添加到字典中,这个简单的例子将为你做到这一点。

if newkey not in mydict:
    mydict[newkey] = newvalue

答案 1 :(得分:0)

列表是一系列元素。元素由隐式索引编号(和排序)。您主要使用此索引来标识列表中的元素。元素可以重复。索引不是。如果为任何元素(由索引标识)指定新值,则新值将替换旧值。

示例:在["day", "midnight", "night", "noon", "day", "night"]中,(隐式)索引为0,1,2,3,4和5. list[0]为“日”,list[1]为“午夜”, list[4]也是“日”,依此类推。 list[3]= "midday"将元素3的值从“正午”更改为“正午”。 list.append("afternoon")在列表末尾添加了一个元素,该元素变为list[6]

列表可用于表示:

  • (可能重复的)元素的集合。
  • 订单(列表中的位置)所在的元素集合 重要的。

词典是没有内在顺序的元素的集合。字典中的元素由显式键标识。与列表一样,元素可以重复,但键不能重复,如果为任何元素(由标识)分配新值,则新值将替换旧值。

示例:在{"dia": "day", "medianoche": "midnight", "noche": "night", "mediodia": "noon", "tag": "day", "nacht": "night"}键中有“dia”,“medianoche”,“noche”,“mediodia”,“tag”和“nacht”。 dict["dia"]为“日”,dict["medianoche"]为“午夜”,dict["tag"]也为“日”,依此类推。 dict["mediodia"]= "midday"会将“mediodia”中标识的元素的值从“正午”替换为“正午”,而dict["tardes"]= "afternoon"会为值为“下午”的关键“tardes”添加元素,因为之前没有“tardes”标识的元素。这与列表不同,后者需要append来添加元素。

字典对于表示:

非常有用
  • 数据的关联(“翻译”,“等同”)(即密钥的关联) 进入元素,但不是相反,因为元素可以重复)。
  • “列表”,其中“索引”不是整数值(但是字符串,浮点值等)
  • “稀疏列表”,其中键是整数,但是广泛的大学 元素是无。这通常是为了节省内存。

答案 2 :(得分:0)

在您的代码中,您正在创建一个空列表

values = [] 

然后,您创建一个字典{newvalue : oldvalue},其中只有一个元素oldvalue,其键为newvalue。最后,通过方法append将此字典添加到列表中。是的,在Python中,将字典作为列表和列表的元素作为字典(甚至是键)的元素是绝对有效的。但是,这很可能不是你想要实现的目标。

如果您想要的是包含元素newvalueoldvalue的列表,那么您应该写一下:

values= []
values.append(newvalue)
values.append(oldvalue)

或只是

values= [newvalue, oldvalue]

如果您想要的是包含由键oldvalue标识的单个元素newvalue的字典,那么您应该写一下:

values= {}
values[newvalue]= oldvalue

或只是

values= {newvalue: oldvalue}

您的代码无效,因为values最初为空,因此for循环根本不会迭代。你可能想要的是:

values= {}
if newvalue not in values.keys():    # "newvalue not in values" is shorter but can be misleading
    values[newvalue]= oldvalue

values= {}
if values[newvalue] is None:
    values[newvalue]= oldvalue

此外,values.update({newvalue: oldvalue})values[newvalue]= oldvalue的同义词,但您似乎试图通过执行values.append({newvalue: oldvalue})来混合使用此表单和列表。同样,字典不是单元素字典列表(这是您正在构建和尝试操作的字典)。