我有一个字典,里面的值是包含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]]}