Как добавить одинаковые значения к разным ключам в словарях?

У меня есть 2 файла JSON. 1 файл с номерами учеников и 1 файл со студентами.

У меня есть список словарей с именем, электронной почтой и номером студента.

Что я хочу сделать, так это, если есть 60 студентов, я хочу дать им уникальный номер студента. Эта часть работает в операторе elif. Часть, которую я не знаю, как реализовать:

Если есть 20 студентов, я хочу дать, например, 2 студентам один и тот же номер студента (что звучит глупо, но мне это нужно). В этом случае студент является ключом, а номер студента — значением.

Что у меня есть сейчас:


# student
[{"Student1":029182,"e-mail":"[email protected]"},{"Student2":0591238,"e-mail":"[email protected]"},{"Student3":9213189,"e-mail":"[email protected]"}]



studentnumbers = [{"studentnumber":"029182","ID":0},{"studentnumber":"0591238","ID":1},{"studentnumber":"9213189","ID":2}]

students = [list(data.values())[0] for data in studentnumbers]


ID = 0
# students is a list of studentnumbers
if len(students) <= 20:
    # studentInfo is my dictionary with the key and values
    for data in studentnumbers:
        try:
            pass

        except IndexError:
            pass



elif len(students) <= 60:
    for data in studentnumbers:
        try:   
            studentnumbers[ID] = students[ID]
            ID += 1
            break
        except IndexError:
            pass
    print("..")
else:
    print("...")

with open('Students.json','w') as instudent:
    json.dump(studentnumbers,instudent,indent=2)


выведите то, что у меня есть сейчас:

[{"Student1":029182,"e-mail":"[email protected]","studentnumber":029182},
{"Student2":0591238,"e-mail":"[email protected]","studentnumber":9213189},
{"Student3":9213189,"e-mail":"[email protected]","studentnumber":0591238},
{"Student4":9213189,"e-mail":"[email protected]","studentnumber":0294832},
{"Student5":9213189,"e-mail":"[email protected]","studentnumber":0591823},
{"Student6":9213189,"e-mail":"[email protected]","studentnumber":0501852}]

Что я хочу:

[{"Student1":029182,"e-mail":"[email protected]","studentnumber":029182},
{"Student2":0591238,"e-mail":"[email protected]","studentnumber":029182},
{"Student3":9213189,"e-mail":"[email protected]","studentnumber":029182},
{"Student4":9213189,"e-mail":"[email protected]","studentnumber":9213189},
{"Student5":9213189,"e-mail":"[email protected]","studentnumber":9213189},
{"Student6":9213189,"e-mail":"[email protected]","studentnumber":9213189}]

Не очень понятно, что вы спрашиваете. Я предлагаю отредактировать ваш вопрос и сделать его более ясным.

LoMaPh 30.05.2019 02:00

Я постараюсь внести ясность.

Number70 30.05.2019 02:03

В первом случае (<= 20) используйте тот же код, что и <= 60, только не увеличивайте идентификатор (ID += 1).

LoMaPh 30.05.2019 02:13

Да, но там 20 студентов. Для первых 3 мне нужны одинаковые номера студентов с 4 по 6 другие и т.д..

Number70 30.05.2019 02:15

Тогда ваш пример того, что вы хотите, неполный.

LoMaPh 30.05.2019 02:17

Пожалуйста, прочтите и следуйте инструкциям по размещению сообщений в справочной документации, предложенным при создании этой учетной записи. Здесь применяется Минимальный, полный, проверяемый пример. Мы не сможем эффективно помочь вам, пока вы не опубликуете свой код MCVE и точно не укажете проблему. Мы должны иметь возможность вставить ваш опубликованный код в текстовый файл и воспроизвести указанную вами проблему. В вашем опубликованном коде отсутствуют некоторые определения переменных и основная программа. Код включает в себя блоки try -- except, которые, кажется, не помогают желаемому результату.

Prune 30.05.2019 02:31

Похоже, вы пытаетесь программировать за пределами своего уровня комфорта сразу в нескольких направлениях. Я рекомендую поэтапное программирование: начните с простого, добавляйте по 2-5 строк кода за раз и не продолжайте, пока не протестируете эти строки. На данный момент у вас есть нерешенные проблемы с try, dict и перемещением данных.

Prune 30.05.2019 02:34

@Prune, дело в том, что я не могу скопировать и вставить все, что я сделал. Есть конфиденциальная информация, и поэтому я, возможно, пропустил что-то, что нужно включить. Я пытаюсь включить все, но вижу, что пропустил уточнение 1/2 вещей. В моей программе все работает..

Number70 30.05.2019 02:36

Код, который вы разместили, не работает. Есть несколько синтаксических и смысловых ошибок.

Prune 30.05.2019 02:40

@Prune, может быть, теперь это работает? Отредактировал сообщение

Number70 30.05.2019 02:57
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
10
83
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Мне лично не нравится использовать словари, я просто думаю, что объект класса намного удобнее, хотя, возможно, медленнее в больших масштабах.

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

вот как бы я это сделал

import random as r

class student():
    def __init__(self,ID,numb):
        self.number = ID
        self.email = '[email protected]'
        self.name = 'student{}'.format(numb)

students = []
for i in range(60):
    x = student(r.randint(10000,99999),i)
    students.append(x)
def test():
    ID = 0
    for i in list(students):
        print(i.name,i.number,i.email)

test()

если вы хотите установить номер студента, просто измените бит r.randint

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

Ответ принят как подходящий

Может быть, приведенный ниже код может помочь. Я должен понять, что вы не можете использовать целое число, например 025. Поэтому я меняю его на строки.

# student numbers
studentNunbers = [{"studentnumber": '029182', "ID": 0}, {"studentnumber": '0591238',"ID": 1},{"studentnumber": '9213189', "ID":2}]
# student
studentInfos = [{"Student1":'029182', "e-mail":'[email protected]'}, {"Student2":'0591238',"e-mail":'[email protected]'},
                {"Student3":'9213189',"e-mail":'[email protected]'}, {"Student3":'92189',"e-mail":'[email protected]'},
                {"Student2":'0538',"e-mail":'[email protected]'}, {"Student2":'238',"e-mail":'[email protected]'},
                {"Student2":'0598',"e-mail":'[email protected]'}, {"Student2":'08',"e-mail":'[email protected]'},]

students = [list(data.values())[0] for data in studentNunbers]

def merge(numRep=1):
    key = "studentnumber"
    stNumberIndex = 0
    iterInd = numRep
    for i in range(len(studentInfos)):
        value = studentNunbers[stNumberIndex][key]
        studentInfos[i][key] = value

        iterInd -= 1
        if iterInd == 0:
            iterInd = numRep
            stNumberIndex += 1

def test():
    if len(studentNunbers) < 20:
        merge(numRep=3)

    elif len(studentNunbers) < 60:
        merge(numRep=1)
    else:
        pass

test()
print(studentInfos)

Большое спасибо, сэр. Это то, что я искал.

Number70 30.05.2019 03:16

Рад помочь, но большую часть времени я трачу на то, чтобы понять вашу цель.

ToughMind 30.05.2019 03:33

Ха-ха, извините... для следующего вопроса я сделаю глубокий вдох, прежде чем объяснять свою проблему.

Number70 30.05.2019 03:35

Кажется, вы хотите условно обновить список диктов.

Дано

import random


students = [
    {"Student1": "029182", "e-mail": "[email protected]"},
    {"Student2": "0591238", "e-mail": "[email protected]"},
    {"Student3": "9213189", "e-mail": "[email protected]"},
]

Код

def get_unique_numbers(size=10):
    """Return an a list of unique random values."""
    return random.sample(range(10000, 99999), size)


def update(students):
    """Return a list of updated dicts."""
    n = len(students)

    # Conditionally, generate student numbers
    if n <= 20:
        student_numbers = [students[0]["Student1"]] * n
    elif 20 < n <= 60:
        student_numbers = get_unique_numbers(n)

    # Update dicts w/student numbers
    return [{**d, "student_num": n} for d, n in zip(students, student_numbers)]

Демо

Небольшой список студентов (n <= 20) возвращает диктовки с тем же номером студента:

update(students)
# [{'Student1': '029182', 'e-mail': '[email protected]', 'student_num': '029182'},
#  {'Student2': '0591238', 'e-mail': '[email protected]', 'student_num': '029182'},
#  {'Student3': '9213189', 'e-mail': '[email protected]', 'student_num': '029182'}]

Список большего размера (n > 20) возвращает словари со случайными номерами учащихся*:

update(students * 7)
# {'Student1': '029182', 'e-mail': '[email protected]', 'student_num': 28308},
# {'Student2': '0591238', 'e-mail': '[email protected]', 'student_num': 21986},
# {'Student3': '9213189', 'e-mail': '[email protected]', 'student_num': 36603},
# ...
# {'Student1': '029182', 'e-mail': '[email protected]', 'student_num': 38362},
# {'Student2': '0591238', 'e-mail': '[email protected]', 'student_num': 99305},
# {'Student3': '9213189', 'e-mail': '[email protected]', 'student_num': 78360}

*Note: implement the random number generator however you wish. This one returns random integers from a sample population.

Другие вопросы по теме

Похожие вопросы