当数组的值相同时,消除由数组形成的字典元素

时间:2017-11-24 10:53:29

标签: python python-3.x dictionary

我有这样的字典:

{0: [3406, 3076, 3470], 1: [3792, 3076, 3470], 2: [3470, 3076, 3406], 3: [3792, 3470, 3406], 4: [3470, 3292, 3406], 6: [3792, 3406, 3470]}

你可以理解0和2不相等但共享相同的元素,我想删除字典中相同的这些元素。在这种情况下,它将减少为:

{0: [3406, 3076, 3470], 1: [3792, 3076, 3470], 2: [3792, 3470, 3406], 3: [3470, 3292, 3406]}

编辑:

aux = 0 definitivo = {}

表示key1,result.items()中的值1:

for key2, value2 in result.items():

    if key1!=key2:
        if len(list(set(value1).intersection(value2)))==3:
            definitivo[aux]=value1
            aux = aux+1

打印(definitivo)

我试图得到交叉点为3的那些,然后消除它们。但它没有用。

3 个答案:

答案 0 :(得分:0)

您可以将每个列表转换为frozenset。这样,您可以将该集用作dict键,任何出现两次的集都将被覆盖:

>>> data = {0: [3406, 3076, 3470], 1: [3792, 3076, 3470], 2: [3470, 3076, 3406], 3: [3792, 3470, 3406], 4: [3470, 3292, 3406], 6: [3792, 3406, 3470]}
>>> uniq = {frozenset(l):k for k,l in data.items()}
{frozenset({3470, 3076, 3406}): 2, frozenset({3792, 3076, 3470}): 1, frozenset({3792, 3406, 3470}): 6, frozenset({3406, 3292, 3470}): 4}

您可以反转这些对并将这些集转换回列表:

>>> {i:list(s) for s,i in uniq.items()}
{2: [3470, 3076, 3406], 1: [3792, 3076, 3470], 6: [3792, 3406, 3470], 4: [3406, 3292, 3470]}

请注意,由于原始数据是dict,因此无法保留键顺序,而dict在Python中是无序的。

答案 1 :(得分:0)

识别相同唯一值的另一种简单方法如下:

  1. 排序键内的数组
  2. 删除,如果相等
  3. 注意:这是算法

    for key1,value1 in dict:
        for key2,value2 in dict:
            if key1 != key2 and value1.sort()==value2.sort():
                del dict['key2']
    

答案 2 :(得分:0)

将dict的值更改为元组,对其进行排序并将其存储在另一个查找字典中。检查查找中是否存在每个新值,然后过滤掉已存在的值。

data = {0: [3406, 3076, 3470], 1: [3792, 3076, 3470], 2: [3470, 3076, 3406], 3: [3792, 3470, 3406], 4: [3470, 3292, 3406], 6: [3792, 3406, 3470]}

lookup = dict()
i = 0
filter_data = dict()

for k in data:
    value = tuple(sorted(data[k]))
    if value not in lookup:
        lookup[value] = 1
        filter_data[i] = data[k]
        i = i + 1

print (filter_data)