Добавьте ключ дублированного значения в список python

#python #dictionary

#python #словарь

Вопрос:

У меня есть словарь, который нравится студентам dic={1:[1,2],2:[1],3:[1,4]} . Мне нужно отсортировать его и посмотреть, имеют ли учащиеся одинаковые значения. Если это произойдет, студент, который появляется первым, имеет приоритет, а у другого студента есть 2 варианта. Например, в приведенном выше примере с учеником 1 ничего не происходит, ученик 2 должен быть добавлен в отдельный список, поскольку значение 1 уже использовалось, а ученик 3, поскольку он имеет значение, которое ранее не появлялось, с ним тоже ничего не происходит. Таким образом, в основном вывод, который мне понадобится для этого примера, будет [2] . Мне удалось отсортировать словарь, выполнив sorted(dic.items(), key=lambda t: t[0]) , но я не знаю, как их сравнить, единственное, что я знаю, это то, что после сравнения мне нужно было бы сделать что-то вроде

 list=[]
list.append(number)
 

Ответ №1:

Вы должны использовать набор для кумулятивного сохранения предыдущих значений и повторять свой словарь.

Код может быть:

 prev = set()                       # no values initialy seen
new_list = []                      # no student intialy in the new liest
for st, vals in dic.items():       # iterate on dic
    if set(vals).issubset(prev):   # is there no new value?
        new_list.append(st)        # add the student to new_list
    prev = prev.union(set(vals))   # and add its values to the seen set
 

В вашем примере мы получаем, как и ожидалось [2] , для new_list .

Комментарии:

1. Я не был уверен, как выполнить итерацию словаря, но теперь я это понимаю. Спасибо!

Ответ №2:

Для каждого элемента вы можете проверить, является ли он подмножеством любых предыдущих значений со сложностью O (n2)

 dic={1:[1,2],2:[1],3:[1,4]}

st_values = list(dic.values())
keys = list(dic.keys())
output = []
for i,v in enumerate(st_values):
    for j in range(0, i):
        if(set(v).issubset(st_values[j])):
            output.append(keys[i])
            
print(output)
 
 [2]
 

Ответ №3:

Вы можете использовать наборы. Поскольку используемая вами функция sorted() возвращает список кортежей:

 dic = sorted(dic.items(), key=lambda t: t[0])
appeared=set()
t=[]
for item in dic:
    if not set(item[1]).issubset(appeared):
        appeared.update(item[1])
    else:
        t.append(item[0])
print(f'Result: {t}')
 

Вывод:

 Result: [2]