如何比较实际键和上一个键的值



我有一个字典,里面的值是包含2个数字的列表。

例如:

z_n = {'1': [[4, 7], [7, 8], [7, 9], [6, 7]], '2': [[4, 5], [8, 10], [3, 4]]}

首先,我想从第一个键中删除值内所有列表的数字7。

工作原理如下:

root = 7
# Iterating through dictionary z_n
for key, value in z_n.items():
# Iterating through lists of values
for lis in value:
#
if root in lis:
# Removing 7 from the list
lis.remove(root)

对于第一个密钥,它将是这样的:

z_n = {'1': [[4], [8], [9], [6]], '2': [[4, 5], [8, 10], [3, 4]]}

从下面的键开始,我想将它们的值与上一个键的值进行比较,然后再次从每个列表中删除它们。

在这种情况下,如果4、8、9和6在'2': [[4, 5], [8, 10], [3, 4]]中,我想删除它们,这样它将是这样的:
'2': [[5],[10],[3]]

如何将实际键的每个值与上一个键的所有值进行比较,如果它们都在这两个值中,则将其删除?

这是我的解决方案:

import itertools
def remove_func(sublist, remove_list):
new_sublist = []
for i in sublist:
temp = []
for j in i:
if j not in remove_list:
temp.append(j)
new_sublist.append(temp)

return new_sublist

z_n = {'1': [[4, 7], [7, 8], [7, 9], [6, 7]], '2': [[4, 5], [8, 10], [3, 4]]}
remove_list = [7]
for key, value in z_n.items():
z_n[key] = remove_func(z_n[key], remove_list )
remove_list = list(itertools.chain(*z_n[key]))

print(z_n)

输出:

{'1': [[4], [8], [9], [6]], '2': [[5], [10], [3]]}

从你被卡住的地方开始,也就是说,我假设你已经从字典中的第一个键中删除了数字7。

您可以首先为第一个键的所有值创建一个集合,然后过滤掉第二个键的值列表中的值:

values=set(x for v in z_n['1'] for x in v)
z_n['2'] = [[v for v in x if v not in values] for x in z_n['2']]
# z_n
{'1': [[4], [8], [9], [6]], '2': [[5], [10], [3]]}

这里有另一种使用集合的方法:

z_n = {'1': [[4, 7], [7, 8], [7, 9], [6, 7]], '2': [[4, 5], [8, 10], [3, 4]]}
root = 7
s = {root}
for i, k in enumerate(z_n.keys()):
z_n[k] = [list(set(e) - s) for e in z_n[k]]
if i == 0:
s = {e[0] for e in z_n[k]}
print(z_n)

输出:

{'1': [[4], [8], [9], [6]], '2': [[5], [10], [3]]}

代码:

z_n['2'] = [[*(set(sum(z_n['1'], []))^set(val))&set(val),] for idx,val in enumerate(z_n['2'])]

z_n['2'] = [[*set(sum(z_n['1'], [])).intersection(val).symmetric_difference(val),] for idx,val in enumerate(z_n['2'])]

输出:

{'1': [[4], [8], [9], [6]], '2': [[5], [10], [3]]}

相关内容

  • 没有找到相关文章

最新更新