Словарь значение заменить - PullRequest
0 голосов
/ 16 декабря 2018

Представьте, что у меня есть словарь, подобный этому:

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 голосов
/ 16 декабря 2018

Другой подход в одном выражении с использованием 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()
# }

print (output)

Output:

{'1': ['a'], '2': ['c'], '3': ['e'], '4': ['g']}
0 голосов
/ 16 декабря 2018

Инициализируйте ваши правильные значения внутри 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']}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...