При работе над управлением клиентскими данными в проекте мне нужно было убедиться, что у двух клиентов не может быть одинакового адреса электронной почты с уникальным идентификатором клиента. Данные клиента хранились в словаре.
Чтобы найти дубликаты адресов электронной почты, указанных в словаре, я использовал несколько подходов. В этом уроке я подробно опишу эти методы, чтобы вы могли применять их в любое время.
В Python есть несколько способов поиска повторяющихся значений в словаре. Здесь я расскажу о трёх известных мне подходах, например, об использовании обратного словаря с методами values() и setdefault().
Используя обратный словарь
Подход с использованием обратного словаря рассматривает ключ как значение, а значение — как ключ. Создаётся обратный словарь: если значение уже есть в обратном словаре, то это означает, что оно повторяется.
Например, если у вас есть словарь, где ключи — это предметы, а значения — учащиеся, вы можете использовать обратный словарь, чтобы найти повторяющиеся предметы, принадлежащие одному и тому же учащемуся.
def find_duplicates_values(data): # Creating empty to stored the revers of key-value pair reverse_dict = {} # Creating a dictionary to store the duplicates values duplicates = {} # Iterate through the dictionary for key, value in data.items(): # Adding the key-value pair to the reverse dictionary if value not in reverse_dict: # If the value doesn't exist, create a new key-value pair reverse_dict[value] = [key] else: # If the value already exists, append the key to the dictionary reverse_dict[value].append(key) for value, keys in reverse_dict.items(): # Checking if the length of the keys is greater than 1 if len(keys) > 1: # Adding the keys to the duplicates dictionary with same value duplicates[value] = keys # Returning found duplicate values with key return duplicates subjects = { 'James': 'Math', 'Roy': 'Science', 'Bobby': 'Math', 'Edward': 'History', 'Philip': 'Science' } # Calling find_duplicate_values function # with dictionary containing duplicate values duplicate_dict_value = find_duplicates_values(subjects) # Printing the duplicate values with key print(duplicate_dict_value)
Из результатов видно, что по предмету «Математика» есть два ученика: Джеймс и Бобби. Это означает, что предмет «Математика» указан дважды (или дублируется).
В итоге мы получаем обратный словарь, где значения становятся ключами, а ключи — значениями. Например, {‘Math’: [‘James’, ‘Bobby’], ‘Science’: [‘Roy’, ‘Philip’]}. То есть по предметам «Математика» и «Наука» у нас есть по два ученика, а это значит, что эти предметы повторяются.
Здесь ключевыми словами являются «Математика» и «Наука», но в исходном словаре они были значениями, поэтому они повторяются.
Используя метод values()
Вы можете использовать цикл for для перебора значений словаря с помощью метода values(). Это позволит вам получить все значения словаря. Затем вы можете проверить, есть ли повторяющиеся значения, используя условный оператор IF.
Если значение уже присутствует в словаре более одного раза, отметьте его как дубликат. В противном случае присвойте этому значению метку «не повторяющееся».
Например, посмотрите и поймите тему ниже.
# Creating a dictionary to store the subjects subjects = { 'James': 'Math', 'Roy': 'Science', 'Bobby': 'Math', 'Edward': 'History', 'Philip': 'Science' } # Creating empty dictionary to store the duplicate values dict_duplicate_values = {} # Iterating through all the values of the dictionary for value in subjects.values(): # Checking if the value is already present in the dictionary if value not in dict_duplicate_values: # If the value is not present, add it to the dictionary dict_duplicate_values[value] = "Not Duplicate" else: # If the value is present, update the value in the dictionary dict_duplicate_values[value] = "Duplicate" # Printing the dictionary with duplicate values print(dict_duplicate_values)
Из выходных данных следует, что возвращаемый результат содержит элементы с определёнными значениями, которые выступают в роли ключей, и соответствующими им метками, которые являются значениями. При этом в словаре повторяются такие значения, как «математика» и «естествознание».
Используя метод setdefault()
В Python существует метод setdefault(), который позволяет установить значение по умолчанию для ключа в словаре, если этот ключ ещё не присутствует в словаре.
Если ключ уже есть в словаре, то метод вернёт существующее значение. Этот метод особенно полезен, когда нужно агрегировать данные или выполнить подсчёт без необходимости предварительно проверять наличие ключа перед увеличением соответствующего значения.
Также для поиска всех повторяющихся значений в словаре можно использовать понимание списка.
Например, посмотрите и запустите приведенный ниже код.
def find_duplicate_values(input_dict): # Creating reverse dictionary to group keys by their values reverse_dict = {} for key, value in input_dict.items(): reverse_dict.setdefault(value, set()).add(key) # Finding values with more than one key to find duplicate values duplicate_values = [value for value, keys in reverse_dict.items() if len(keys) > 1] return duplicate_values # Original dictionary original_dict = {'Sun': 5, 'Mon': 3, 'Tue': 5, 'Wed': 4} # Finding duplicate values by calling the find_duplicate_values function duplicates = find_duplicate_values(original_dict) # Printing the duplicate values print("Duplicate Values:", duplicates)
Посмотрите повторяющееся значение в словаре, original_dict равен 5 для разных ключей.