#python #list #range
Вопрос:
Я создал функцию, которая принимает число N от пользователя, а затем запрашивает пару чисел у пользователя N раз. Эти пары добавляются в список в виде диапазона. Затем функция возвращает список диапазонов.
В другой функции я хочу найти количество уникальных элементов в этих диапазонах. Таким образом, этот список передается этой функции. Однако я не уверен в том, как получить числа из каждого диапазона в списке. Я хотел создать набор и добавить в него каждое число в каждом диапазоне. Я создал цикл for для выполнения каждого элемента в списке. Однако, когда я создал пустую переменную и установил ее в список в элементе x, я получил сообщение об ошибке, которое гласит range object cannot be interpreted as an integer
. Затем я попытался инициализировать пустой список и установить его для каждого элемента в списке, но мне выдали сообщение об ошибке, которое гласит list indices must be integers or slices, not range
.
Вот пример части моего кода:
def get_input():
num_events = int(input())
events = []
for i in range(0, num_events):
si, ti = (input("Enter the start and end days of event #" str(i 1) ": ").split())
events.append(range(int(si), int(ti)))
return events
def calculate(events):
new_set = set()
for l in events:
check = events[l]
new_set.add(check)
unique_days = len(new_set)
return unique_days
Комментарии:
1. для каждого
l
оператора infor l in events
является arange
, а не индексом или целым числом, поэтомуevents[l]
неправильно индексируетсяrange
. пересмотрите свой код с помощьюfor l in enumerate(events):
илиcheck = l
.2. Ваша
get_input()
функция заключается в созданииrange
объектов, а не последовательностей чисел. В какой-то момент вам нужно будет преобразовать их в одно целое:check = list(events[l])
т. е.
Ответ №1:
Это происходит потому, что вы пытаетесь получить доступ к фрагменту своего элемента. Позвольте мне объяснить :
Когда вы пишете for l in events
l, это объект диапазона. Вы не можете использовать обозначение [] для объектов диапазона.
Наконец, вам нужна сумма уникальных дней.
Попробуй это :
def get_input():
num_events = int(input())
events = []
for i in range(0, num_events):
si, ti = (input("Enter the start and end days of event #"
str(i 1) ": ").split())
events.append(range(int(si), int(ti)))
return events
def calculate(events):
new_set = set()
unique_days = 0
for check in events:
new_set.add(check)
unique_days = len(check)
return unique_days
С помощью этого кода вывод будет, например :
events = get_input()
# num_events = 2
# date for day 1 : 1 and 3
# date for event 2 : 4 and 5
ud = calculate(events)
print(ud) # print (3-1) (5-4) = 2 1 = 3
Ответ №2:
Как я уже сказал в комментарии, ваша функция get_input() создает список range
объектов, а не подсписки значений в диапазоне. Исправление этого просто включает в себя создание подсписков, когда это необходимо (на самом деле для set
s вам нужны значения, которые являются хэшируемыми последовательностями, такими как a tuple
, а не a list
).
def get_input():
intervals = (1, 3), (2, 6), (5, 7) # Hardcode some input data for testing.
events = [range(a, b) for a, b in intervals]
return events
# num_events = int(input())
# events = []
#
# for i in range(0, num_events):
# si, ti = (input("Enter the start and end days of event #" str(i 1) ": ").split())
# events.append(range(int(si), int(ti)))
#
# return events
def calculate(events):
new_set = set()
for event in events:
check = tuple(event) # Convert range into a tuple (a hashable sequence)
new_set.add(check)
print(f'{new_set=}') # -> new_set={(1, 2), (2, 3, 4, 5), (5, 6)}
unique_days = len(new_set)
return unique_days
events = get_input()
print(f'{events=}') # -> events=[range(1, 3), range(2, 6), range(5, 7)]
unique_days = calculate(events)
print(f'{unique_days=}') # -> unique_days=3