Доступ к элементам в списке диапазонов в Python

#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 оператора in for l in events является a range , а не индексом или целым числом, поэтому 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