迭代列表值字典

时间:2021-04-20 22:58:28

标签: python dictionary

假设我有一个字典,它以元组为键,以元组列表为值,例如:

d={(0,1):[(1,1)],
   (0,2):[(1,1),(1,2)],
   (0,3):[(1,1),(1,2),(1,3)]}

我想删除所有条目,使其值包含在另一个键的值中,例如:

从 d 我想删除带有键 (0,1) 的条目,因为 (1,1) 包含在 [(1,1),(1,2)] 中 并删除键为 (0,2) 的条目,因为 [(1,1),(1,2)] 包含在 [(1,1),(1,2),(1,3)] 中。 列表中元组的顺序很重要。

我可以使用一堆 for 循环来解决这个问题,就像这样:

for key, val in d.items():
    for k,v in d.items():
        for i in range(0, len(val)):
            if val[i] in v and len(v) - len(val) == 1:
                del_me = True
            else:
                del_me = False
                break
        if del_me:
             to_del.append(key)
for key in set(to_del):
    del d[key]

编辑:(进一步解释) 键在这里并不重要,但稍后会很重要。 换句话说: 让 a,b,c,d 表示唯一的元组 让 k1,k2,..., 表示键

让我们输入:

k1:[a],
k2:[d],
k3:[a,b],
k4:[b,a],
k5:[a,b,c],

我想结束: k2,k4,k5

删除的条目将是: k1 因为 a 在 k3 k3 因为 a,b 在 k5 中

看到这个的时候眼睛疼,抱歉。

pythonic 的方法是什么?

1 个答案:

答案 0 :(得分:0)

假设您有一个 dictionary,如下所示:

d={(0,1):[(1,1)],(0,2):[(1,1),(1,2)],(0,3):[(1,1),(1,2),(1,3)],(0,4):[(1,1),(1,2),(1,4)]}

现在您想将 values 与所有 keys 相互比较。我建议您将本字典中的所有值放在 list 中。

mylist=[]
for key in d.keys():
    mylist.append(d[key])
    
print(mylist)

mylist 将如下所示具有字典的所有值。

[[(1, 1)], [(1, 1), (1, 2)], [(1, 1), (1, 2), (1, 3)], [(1, 1), (1, 2), (1, 4)]]

现在您想将所有这些值相互比较,并删除作为其中任何值的 subsets 的那些值。与本例一样,[(1,1)][(1,1),(1,2)] 的子集,因此 [(1,1)] 将被删除。同样,[(1,1),(1,2)][(1,1),(1,2),(1,3)] 的子集,因此它也将被删除。我们可以通过以下方式实现:

out = [] 

for k, elm in enumerate(mylist):  
    for _,elm2 in enumerate(mylist[:k] + mylist[k + 1:]):  
        if frozenset(elm).issubset(elm2):  
            break  
    else:  
        out.append(elm)    

print(out)

out 列表将为我们提供列表 mylist 的唯一元素。

[[(1, 1), (1, 2), (1, 3)], [(1, 1), (1, 2), (1, 4)]]

在上面的代码段中,我们遍历列表并获取当前索引。然后我们再次遍历同一个列表,但我们删除了第一个循环的当前索引处的元素。然后我们将第一个循环的索引的第一个元素转换为 frozenset 并使用方法 issubset 来检查第一个元素是否是第二个元素的子集。

现在我们只是将我们的字典 d 值与 out 列表进行比较。如果 d 值不在 out 列表中,我们从字典 key 中删除该 d。这是按如下方式完成的:

for key in list(d):
    if d[key] not in out:
        del d[key]
        
print(d)

output 字典 d 将是:

{(0, 3): [(1, 1), (1, 2), (1, 3)], (0, 4): [(1, 1), (1, 2), (1, 4)]}