字典值替换

时间:2018-12-16 02:23:21

标签: python list dictionary

想象一下我有这样的字典:

d = {'1':['a'], '2':['b', 'c', 'd'], '3':['e', 'f'], '4':['g']}

字典的每个键代表某个类别的唯一人物。
每个键只能有一个值。
具有一个值的键表示正确的重新分配。
具有多个值的键表示可能性。这些值之一对于该键是最正确的。

我有一个处理后的列表,其值最正确。

LIST = ['c', 'e']

现在我必须在LIST时通过字典的值迭代len(values) > 1的值,并替换为如下所示:

d = {'1':['a'], '2':['c'], '3':['e'], '4':['g']}

2 个答案:

答案 0 :(得分:2)

set内初始化正确的值。

correct = {'c', 'e'}
# correct = set(LIST)

现在,假设具有多个元素的列表值只能包含一个正确的元素,则可以使用条件理解来构建字典:

d2 = {k : list(correct.intersection(v)) if len(v) > 1 else v for k, v in d.items()}
print(d2)
# {'1': ['a'], '2': ['c'], '3': ['e'], '4': ['g']}

如果可能有多个正确的值,则可以只取第一个。

d2 = {}
for k, v in d.items():
    if len(v) > 1:
        c = list(correct.intersection(v))
        v = c[:1]
    d2[k] = v

print(d2)
# {'1': ['a'], '2': ['c'], '3': ['e'], '4': ['g']} 

如果您打算就地改变d(因为制作完整副本可能会很昂贵),那么上述解决方案可简化为

for k, v in d.items():
    if len(v) > 1:
        c = list(correct.intersection(v))
        d[k] = c[:1]

print(d)
# {'1': ['a'], '2': ['c'], '3': ['e'], '4': ['g']}

答案 1 :(得分:0)

使用dict comprehension的一条语句中的另一种方法:

d = {'1':['a'], '2':['b', 'c', 'd'], '3':['e', 'f'], '4':['g']}
a = ['c', 'e']

output = {k: v if not any(j in set(a) for j in v) else list(set(v) & set(a)) if v and isinstance(v, (list, tuple)) else [] for k, v in d.items()}

# More readeable like this:
# {
#    k: v if not any(j in set(a) for j in v) else list(set(v) & set(a))
#       if v and isinstance(v, (list, tuple))
#           else [] for k, v in d.items()
# }

打印(输出)

输出:

{'1': ['a'], '2': ['c'], '3': ['e'], '4': ['g']}