替换字典值列表

时间:2019-03-25 13:23:09

标签: python python-3.x dictionary

给出一个以列表列表作为值的字典,如何在给定特定条件的情况下替换值列表中的某些子列表。

到目前为止,我所尝试的是按长度遍历所有子列表并估计两个子列表中的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的子列表来更新字典。

有任何提示吗?

2 个答案:

答案 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]