У меня есть 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}]
Я постараюсь внести ясность.
В первом случае (<= 20
) используйте тот же код, что и <= 60
, только не увеличивайте идентификатор (ID += 1
).
Да, но там 20 студентов. Для первых 3 мне нужны одинаковые номера студентов с 4 по 6 другие и т.д..
Тогда ваш пример того, что вы хотите, неполный.
Пожалуйста, прочтите и следуйте инструкциям по размещению сообщений в справочной документации, предложенным при создании этой учетной записи. Здесь применяется Минимальный, полный, проверяемый пример. Мы не сможем эффективно помочь вам, пока вы не опубликуете свой код MCVE и точно не укажете проблему. Мы должны иметь возможность вставить ваш опубликованный код в текстовый файл и воспроизвести указанную вами проблему. В вашем опубликованном коде отсутствуют некоторые определения переменных и основная программа. Код включает в себя блоки try -- except
, которые, кажется, не помогают желаемому результату.
Похоже, вы пытаетесь программировать за пределами своего уровня комфорта сразу в нескольких направлениях. Я рекомендую поэтапное программирование: начните с простого, добавляйте по 2-5 строк кода за раз и не продолжайте, пока не протестируете эти строки. На данный момент у вас есть нерешенные проблемы с try
, dict
и перемещением данных.
@Prune, дело в том, что я не могу скопировать и вставить все, что я сделал. Есть конфиденциальная информация, и поэтому я, возможно, пропустил что-то, что нужно включить. Я пытаюсь включить все, но вижу, что пропустил уточнение 1/2 вещей. В моей программе все работает..
Код, который вы разместили, не работает. Есть несколько синтаксических и смысловых ошибок.
@Prune, может быть, теперь это работает? Отредактировал сообщение
Мне лично не нравится использовать словари, я просто думаю, что объект класса намного удобнее, хотя, возможно, медленнее в больших масштабах.
Я не уверен, в чем ваша проблема, я не знаю, что в словаре не может быть двух одинаковых значений.
вот как бы я это сделал
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)
Большое спасибо, сэр. Это то, что я искал.
Рад помочь, но большую часть времени я трачу на то, чтобы понять вашу цель.
Ха-ха, извините... для следующего вопроса я сделаю глубокий вдох, прежде чем объяснять свою проблему.
Кажется, вы хотите условно обновить список диктов.
Дано
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.
Не очень понятно, что вы спрашиваете. Я предлагаю отредактировать ваш вопрос и сделать его более ясным.