【问题标题】:Replace list of values of dictionary替换字典的值列表
【发布时间】:2025-03-04 01:10:01
【问题描述】:

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

到目前为止,我尝试的是按长度迭代所有子列表并估计两个子列表中的公共值。

例如,给定以下字典:

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 的子列表之间的公共元素。因此,子列表 [0,14] 将被替换为公共元素 [14]。这个子列表[4] 最终可以与同一键上的[3] 列表合并。导致[14,3]。相同的逻辑适用于第二个键和子列表列表

但我有点卡在通过保留并最终合并长度为

有什么提示吗?

【问题讨论】:

  • 你能详细说明预期的输出代表什么吗?
  • 我听不懂。如果列表的输入列表是 [[0, 14], [3]],那么与 [14,9] 的交集应该如何是 [14,3]?您能否更清楚地说明您期望的输出是什么?
  • 输出表示候选列表和长度大于 1 的子列表之间的公共元素。因此,子列表 [0,14] 将被替换为公共元素 [14]。这个子列表[4] 最终可以与同一键上的[3] 列表合并。导致[14,3]。相同的逻辑适用于第二个键和子列表列表

标签: python python-3.x dictionary


【解决方案1】:

如果你想更新一个列表,这是可能的,因为列表是一个可变类型,你必须直接改变一个元素。如果您通过中间变量,您只需为该变量分配一个新值:

演示:

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

对于合并部分,我将假设您合并如果键下的所有列表的长度

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]

【讨论】:

    【解决方案2】:

    您可以使用迭代字典项目的字典推导,并使用嵌套列表推导迭代子列表,对于长度大于 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]}
    

    【讨论】: