想象一下我有这样的字典:
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']}
答案 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']}