#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]