给出一个以列表列表作为值的字典,如何在给定特定条件的情况下替换值列表中的某些子列表。
到目前为止,我所尝试的是按长度遍历所有子列表并估计两个子列表中的commom值。
例如,给定以下字典:
d = {(1, 2): [[0, 14], [3]], (10, 12): [[9, 11], [13]]}
以及要与之进行比较的子列表
candidates = [14,9]
我希望我的输出是:
d = {(1, 2): [14, 3], (10, 12): [9, 13]}
到目前为止,我尝试的是按长度遍历所有子列表,并替换两个子列表的交集:
for k,v in d.items():
for l in v():
if len(l) > 1:
v = list(set(l).intersection(candidates)))
输出表示候选列表与长度大于1的子列表之间的commom元素。结果,子列表[0,14]
将被[14]
替换为commom元素。该子列表[4]
最终可以与同一键上的[3]
列表合并。结果为[14,3]
。第二个键和子列表列表具有相同的逻辑
但是,我会通过保留并最终合并长度小于1的子列表来更新字典。
有任何提示吗?
答案 0 :(得分:0)
您可以使用dict理解来遍历dict项,并使用嵌套列表理解来遍历子列表,并且对于长度大于1的子列表中的每个子子列表,请使用set与候选人的交集:
{k: [i for s in l for i in (set(s).intersection(candidates) if len(s) > 1 else s)] for k, l in d.items()}
这将返回:
{(1, 2): [14, 3], (10, 12): [9, 13]}
答案 1 :(得分:0)
如果要更新列表(由于列表是可变类型而可以),则必须直接更改元素。如果您通过中间变量,则只需为该变量分配一个新值:
演示:
l = [1,2,3]
for i in l:
i = 0 # only changes i, no effect on l
l = [1,2,3]
for i, j in enumerate(l):
l[j] = 0 # actually changes l
对于合并部分,如果一个键下的所有列表的长度都为<= 1:
,我将假设您进行合并for k,v in d.items():
merge = True
for i,l in enumerate(v):
if len(l) > 1:
v[i] = list(set(l).intersection(candidates))
if len(v[i]) > 1:
merge = False
if merge:
d[k] = [l[0] for l in v]