Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

В словаре повторяются ключи. Часть данных теряется. Как этого избежать?

Владимир Новый Знаток (366), открыт 4 часа назад
Код:
 import random 
d = 10 #Количество студентов

sp1 = []
sp2 = []
for i in range(d):
a = random.randint(1,11) #случайный номер студенческого билета
sp1.append(a) #ключ
b = str(input('Введите Фамилию и Имя: '))
sp2.append(b) #значение

#print(sp1, sp2)
slov = dict(zip(sp1,sp2))
print(slov)

Ввод:
Введите Фамилию и Имя: Sergey Ivanov
Введите Фамилию и Имя: Ivan Pulgar
Введите Фамилию и Имя: Dmitriy Polyanski
Введите Фамилию и Имя: Wjyceh Kshistovski
Введите Фамилию и Имя: Ivan Ivanon
Введите Фамилию и Имя: Andrey Suslov
Введите Фамилию и Имя: Nikolay Barbov
Введите Фамилию и Имя: Ignat Sergeev
Введите Фамилию и Имя: Vladimir Leonov
Введите Фамилию и Имя: Alexey Buslov

Вывод:
{3: 'Sergey Ivanov', 2: 'Vladimir Leonov', 4: 'Dmitriy Polyanski', 6: 'Alexey Buslov', 7: 'Ignat Sergeev', 5: 'Nikolay Barbov'}


 Как видно в выводе, часть студентов потерялась, т.к. повторяются ключи. 
5 ответов
Улик Додиков Искусственный Интеллект (120365) 4 часа назад
GPT-4o
В Python ключи словаря должны быть уникальными. Если ключи повторяются, то старые значения перезаписываются новыми, что приводит к потере части данных. В вашем случае проблема заключается в том, что случайные номера студенческих билетов могут повторяться. Чтобы избежать потери данных, можно использовать проверку на уникальность ключа перед добавлением его в словарь.

Вот модифицированный вариант вашего кода, который обеспечивает уникальные ключи:

  
import random

d = 10 # Количество студентов

stud_ids = set() # Множество для хранения уникальных студенческих билетов
students = {}

for i in range(d):
while True:
student_id = random.randint(1, 11) # Случайный номер студенческого билета
if student_id not in stud_ids:
stud_ids.add(student_id)
break

student_name = input('Введите Фамилию и Имя: ') # Ввод имени студента
students[student_id] = student_name # Добавление в словарь

print(students)


В этом коде мы используем множество `stud_ids` для отслеживания уникальных номеров студенческих билетов. Каждый раз, когда генерируется новый номер, программа проверяет, не существует ли он уже в множестве. Если номер уникален, он добавляется в множество и используется как ключ в словаре. Таким образом, гарантируется уникальность всех ключей в словаре `students`.

Если количество студентов больше, чем диапазон возможных номеров студенческих билетов, программа может зациклиться в попытках найти уникальный номер. В таком случае нужно увеличить диапазон возможных номеров или изменить логику генерации уникальных ключей.
Инспектор Жопидý Оракул (53255) 4 часа назад
Да, проблема в том, что вы используете случайные номера студенческих билетов в качестве ключей, и эти ключи могут повторяться. Когда вы создаете словарь, значения для повторяющихся ключей перезаписываются, что приводит к потере данных.

Чтобы избежать потери данных, можно использовать различные подходы:

1. Использовать уникальные ключи: Измените способ генерации ключей, чтобы гарантировать их уникальность. Например, можно использовать порядковые номера или сгенерировать уникальные идентификаторы.

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

Вот пример модифицированного кода, который использует уникальные ключи:

```python
import random

d = 10 # Количество студентов

sp1 = []
sp2 = []
for i in range(d):
# Генерируем уникальный номер студенческого билета
a = i + 1 # Порядковый номер от 1 до d
sp1.append(a) # Ключ
b = input('Введите Фамилию и Имя: ')
sp2.append(b) # Значение

# Создаем словарь с уникальными ключами
slov = dict(zip(sp1, sp2))
print(slov)
```

В этом примере ключи уникальны, так как это порядковые номера, и они будут равномерно распределены от 1 до 10.

Если вам нужно использовать случайные числа в качестве ключей, можно предварительно проверять, чтобы число не повторялось:

```python
import random

d = 10 # Количество студентов

keys = set()
sp1 = []
sp2 = []

while len(keys) < d:
a = random.randint(1, 100) # Генерируем случайный номер
if a not in keys:
keys.add(a)
sp1.append(a)

for i in range(d):
b = input('Введите Фамилию и Имя: ')
sp2.append(b)

# Создаем словарь с уникальными ключами
slov = dict(zip(sp1, sp2))
print(slov)
```

В этом примере `keys` — это множество, которое гарантирует уникальность ключей. Мы генерируем случайные номера до тех пор, пока не получим необходимое количество уникальных ключей.

Выбирайте подходящий для вашего случая метод и адаптируйте его под ваши нужды.
Лайт Ягами Искусственный Интеллект (291651) 3 часа назад
Если ключи нужно генерировать рандомные, то во-первых, выбирать их нужно из широкого диапазона (к примеру, 128-битные UUID), а во-вторых, проверять на уникальность, и если такой ключ уже существует, то генерировать новый (хотя вероятность сгенерировать повторный при соблюдении первого пункта очень мала, но перестраховаться лучше, чем случайно затереть старые данные).
Владимир НовыйЗнаток (366) 3 часа назад
     if a in sp1: 
continue
else:
sp1.append(a)
?
Владимир НовыйЗнаток (366) 3 часа назад
Ой, не туда написал
Владимир НовыйЗнаток (366) 3 часа назад
а нет, правильно
Владимир НовыйЗнаток (366) 3 часа назад
У меня получается такое:

Ввод: #почему то не даёт вводить больше 6 =\
 Введите Фамилию и Имя: Sergey Ivanov  
Введите Фамилию и Имя: Ivan Pulgar
Введите Фамилию и Имя: Dmitriy Polyanski
Введите Фамилию и Имя: Wojyceh Kshistovski
Введите Фамилию и Имя: Ivan Ivanov
Введите Фамилию и Имя: Andrey Suslov

Вывод:
{1: 'Sergey Ivanov', 3: 'Ivan Pulgar ', 5: 'Dmitriy Polyanski', 6: 'Wojyceh Kshistovski', 4: 'Ivan Ivanov', 2: 'Andrey Suslov'}
Senior Backend Developer Оракул (78232) 3 часа назад
 import random 

d = 10 # Количество студентов

slov = {}
for a in random.sample(range(1, 11), d):
b = str(input('Введите Фамилию и Имя: '))
slov[a] = b

print(slov)
Владимир НовыйЗнаток (366) 2 часа назад
а что значит random.sample() ?
Senior Backend Developer Оракул (78232) Владимир Новый, выборка случайных элементов из заданной последовательности, на самом деле я не сразу подумал - можно было еще проще использовать random.shuffle (просто перемешать последовательность)
Похожие вопросы