Кто-нибудь может объяснить, почему isdigit() не работает с этим проектом и как я могу это сделать?

#python #list #function #dictionary

#питон #Список #функция #словарь

Вопрос:

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

 # dictionary could be larger dicti = {'John': ['5/5', '50/50', '10/10', '10/10']} liste = [] def f():  for key, value in dicti.items():  count = 0  for i in value:  if i.isdigit(): # kkk  count  = 1  if len(value) == count:  liste.append(key)  print(liste) f() # I realized in # kkk part doesn't see 5/5 as a digit. # How can i make this happen?  

Комментарии:

1. Что вы на самом деле пытаетесь сделать?

2. потому '/' что внутри значений есть символ, который не является цифрой. Все символы должны быть цифрами.

3. В первом ряду я объяснил, что хочу сделать.

4. Могу ли я заставить систему видеть 5/5 как 1, поэтому сделайте вывод i.isdigit () истинным.

5.Что значит «видеть 5/5 как 1»? 5/5 не 1 . Если вы хотите 1 , чтобы в словаре в первую очередь, зачем ставить 5/5 вместо этого? Откуда берутся эти данные?

Ответ №1:

'5/5' является строкой, и isdigit() метод вернет значение True только в том случае, если все символы являются цифрами. Это не из '/' -за чего . С другой стороны, Python не оценивает содержимое строки. Это сам объект ! (Я не рекомендую использовать eval для оценки эту строку, если это то, что вы намерены сделать)

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

 dicti = {  'John': ['5/5', '50/50', '10/10', '10/10'],  'test_person': ['5/5', '49/50'] }  def is_full(x):  left, right = x.split('/')  return left == right  lst = [] for k, v in dicti.items():  if all(is_full(grade) for grade in v):  lst.append(k)  print(lst)  

выход:

 ['John']  

Ответ №2:

Вы должны записать элементы списка в значение словаря в виде целых чисел строкового типа. Например, вместо того, чтобы писать «10/10», вы должны написать «1». так что это будет работать должным образом.

Комментарии:

1. Входные данные дает мой учитель. К сожалению, я не в состоянии их изменить.

Ответ №3:

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

 dicti = {'John': ['5/5', '50/50', '10/10', '10/10']} fullMarks = ['5/5', '50/50', '10/10', '10/10']; names = []; # an empty list to add names whose marks are full  def f():  for keys,values in dicti.items():  for value in values: # looping through the value list inside the list  if(value in fullMarks): # if the full marks are in the list (even one time)  names.append(keys); # adding the name into the empty list  break; # don't loop further f() print(names);  

Комментарии:

1. Это решение может быть применимо, но мои преподаватели uni. настолько раздражают, что, когда они видят решение, которое будет работать только для 1 ввода/словаря, они пытаются использовать другой ввод/словарь.

Ответ №4:

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

 import re  dicti = {'John': ['5/5', '50/50', '10/10', '10/10'], 'Paul': ['4/5', '50/50', '10/10', '10/10']} def f():  liste = [key for key, value in dicti.items() if all([re.match("(d )/\1", v) for v in value])]  print(liste) f()  

выход

 ['John']  

В принципе, "(d )/\1" совпадения, когда число до и после косой черты одинаковое, т. е. Достигается полная отметка, однако вы хотите ее выразить.