假设我有一个字典,它以元组为键,以元组列表为值,例如:
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 的方法是什么?
答案 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)]}