Проблема со списками Hackerrank ~ Стандартный тестовый пример работает, а другие нет

Рассмотрим список (список = []). Вы можете выполнять следующие команды:

insert i e: Insert integer e at position .
print: Print the list.
remove e: Delete the first occurrence of integer e.
append e: Insert integer e at the end of the list.
sort: Sort the list.
pop: Pop the last element from the list.
reverse: Reverse the list.

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

Пример ввода:

12
insert 0 5
insert 1 10
insert 0 6
print
remove 6
append 9
append 1
sort
print
pop
reverse
print

Мой код:

import sys

if __name__ == '__main__':
    N = int(input())

my_list = []
inputs  = []

for line in sys.stdin:
    inputs.append(line)

for item in inputs:
    if item[0:5] == 'print':
        print(my_list)
    elif item[0:2] == 'in':
        inserts = [s for s in item.split()][1:3]
        inserts = list(map(int, inserts))
        my_list.insert(inserts[0], inserts[1])
    elif item[0:3] == 'rem':
        inserts = list(map(int, [s for s in item.split()][1]))
        my_list.remove(inserts[0])
    elif item[0:2] == 'ap':
        inserts = list(map(int, [s for s in item.split()][1]))
        my_list.append(inserts[0])
    elif item[0:4] == 'sort':
        my_list.sort()
    elif item[0:3] == 'pop':
        my_list.pop()
    elif item[0:7] == 'reverse':
        my_list.reverse()

Я не уверен, почему мой код не утверждается при отправке. В этом тестовом случае, который они предоставили, мой код проходит. Ожидаемый результат следующий:

[6, 5, 10]
[1, 5, 9, 10]
[9, 5, 1]

Большое спасибо за помощь!

Вы читаете N из stdin, но никогда не используете его. Возможно ли, что это приводит к проблемам, когда количество строк во входном потоке отличается от N? (обратите внимание, что я не читал спецификацию проблемы)

gboffi 26.04.2019 07:10

Честно говоря, я не уверен, что это имеет значение. Из того, что я вижу, это не должно влиять на результат, верно? Первое число обозначает только то, сколько команд может быть.

datam 26.04.2019 07:15
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
27 913
12
Перейти к ответу Данный вопрос помечен как решенный

Ответы 12

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

Ваша проблема в том, что в вашем коде добавления есть ошибка, когда добавляемое число имеет более одной цифры. В вашем коде здесь

inserts = list(map(int, [s for s in item.split()][1]))
my_list.append(inserts[0])

например, если команда «item» была «добавить 12», [s for s in item.split()][1] будет строкой «12», поэтому list(map(int, [s for s in item.split()][1])) сопоставляет каждый символ в этой строке с целым числом, давая вам [1, 2], а не [12], и поэтому my_list.append(inserts[0]) будет добавлять число 1 вместо 12. Так что исправьте это, и вы решите свою проблему.

Большое спасибо за это! Это решило мою проблему. Я ценю помощь.

datam 27.04.2019 22:06

Нарезка строки не является хорошей идеей. Кроме того, вам нужно получить пользовательский ввод N раз. Таким образом, вы можете отредактировать свое решение, как показано ниже:

if __name__ == '__main__':
    N = int(input())
    the_list = list()

    for _ in range(N):
        query = input().split()
        if query[0] == "print":
            print(the_list)
        elif query[0] == "insert":
            the_list.insert(int(query[1]), int(query[2]))
        elif query[0] == "remove":
            the_list.remove(int(query[1]))
        elif query[0] == "append":
            the_list.append(int(query[1]))
        elif query[0] == "sort":
            the_list = sorted(the_list)
        elif query[0] == "pop":
            the_list.pop()
        elif query[0] == "reverse":
            the_list.reverse()

Почему мы делаем это «query = input().split()»? Мне нужно понять его цель

Rahul 28.10.2020 19:02

@Rahul, потому что нам нужно получить правильный формат ввода пользователя. Помните, что пользовательский ввод — это строка, но нам нужно первое слово в виде строки, а остальные должны быть целыми, чтобы решить проблему.

hevalhazalkurt 12.11.2020 16:37
if __name__ == '__main__':
    N = int(input())
    m=list()
    for i in range(N):
       method,*l=input().split()
       k=list(map(int,l))
       if len(k)==2:
          q=[k[0]]
          w=[k[1]]
       elif len(k)==1:
          q=[k[0]]
       if method =='insert':
          m.insert(q[0],w[0])
       elif method == 'append':
          m.append(q[0])
       elif  method == 'remove':
          m.remove(q[0])
       elif method =='print':
          print(m)
       elif method == 'reverse':
          m.reverse()
       elif method =='pop':
          m.pop()
       elif method == 'sort':
          m.sort()

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

David Buck 10.06.2020 10:52
def execute(lst, cmd, *args):
    if cmd == 'insert':
        lst.insert(int(args[0]), int(args[1]))
    elif cmd == 'print':
        print(lst)
    elif cmd == 'remove':
        lst.remove(int(args[0]))
    elif cmd == 'append':
        lst.append(int(args[0]))
    elif cmd == 'sort':
        lst.sort()
    elif cmd == 'reverse':
        lst.reverse()
    elif cmd == 'pop':
        lst.pop()
   else: 
        print("Command not recognized!")

lst = []
for _ in range(int(input())):
execute(lst, *input().split())
if __name__ == '__main__':
N = int(input())
reqarr = []
for i in range(0,N):
    inplist = (input().split())
    if (inplist[0] == "insert" ):
        reqarr.insert(int(inplist[1]),int(inplist[2]))
    elif (inplist[0] == "print"):
        print(reqarr)
    elif (inplist[0] == "remove"):
        reqarr.remove(int(inplist[1]))
    elif (inplist[0] == "append"):
        reqarr.append(int(inplist[1])) 
    elif (inplist[0]= = "sort"):
        reqarr.sort()   
    elif (inplist[0]= = "reverse"):
        reqarr.reverse() 
    elif (inplist[0] == "pop"):
        reqarr.pop()              
                
    

Добро пожаловать в СО. Хотя мы благодарим вас за ваш ответ, было бы лучше, если бы он имел дополнительную ценность по сравнению с другими ответами. В этом случае ваш ответ не представляет дополнительной ценности, поскольку hevalhazalkurt уже опубликовал это решение. Если предыдущий ответ был вам полезен, вы должны проголосовать за него, как только у вас будет достаточно репутации.

Doj 17.12.2020 04:03

Хорошо. Я постараюсь сделать это из следующих вкладов.

Tejeshwar Reddy 18.12.2020 05:09
def operation(last_value1,operation_name,*number):
    list_number = last_value1
    if operation_name.lower() == 'insert':
        list_number.insert(int(number[0]),int(number[1]))
    elif operation_name.lower() == 'remove':
        list_number.remove(int(number[0]))
    elif operation_name.lower() == 'append':
        list_number.append(int(number[0]))
    elif operation_name.lower() == 'sort':
        list_number = sorted(list_number)
    elif operation_name.lower() == 'print':
        print(list_number)
    elif operation_name.lower() == 'pop':
        list_number.pop()
    elif operation_name.lower() == 'reverse':
        list_number= list_number[::-1]
    return list_number

N = int(input())
last_value = []
for count in range(0,N):
        command_input = input("Please enter the command with number seperated by space")
        command_input = command_input.split()
        if len(command_input) == 3:
            last_value = operation(last_value,command_input[0],command_input[1],command_input[2])
        elif len(command_input) == 2:
            last_value= operation(last_value,command_input[0],command_input[1])
        else:
            last_value = operation(last_value,command_input[0])

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

Tyler2P 15.01.2021 12:51
*if __name__ == '__main__':
    N = int(input())
    the_list = list()
    
    for cmd in range(N):
        input_cmd = input().split()
        if input_cmd[0] == 'print':
            print(the_list)
        
        elif input_cmd[0] == 'insert':
            the_list.insert(int(input_cmd[1]), int(input_cmd[2]))
        
        elif input_cmd[0] == 'remove':
            the_list.remove(int(input_cmd[1]))
        
        elif input_cmd[0] == 'append':
            the_list.append(int(input_cmd[1]))
        
        elif input_cmd[0] == 'sort':
            the_list = sorted(the_list)
            
        elif input_cmd[0] == 'pop':
            the_list.pop()
        
        elif input_cmd[0] == 'reverse':
            the_list.reverse()*
        

Хотя ответы только по коду могут помочь в конкретном случае, предоставьте подробную информацию о том, почему и как это работает, чтобы можно было решить аналогичные проблемы.

creyD 23.01.2021 14:36

Вот решение без операторов «if» или «elif»:

if __name__ == '__main__':
    N = int(input())
    commands = {
        "insert": lambda x, y, z: x.insert(y, z),
        "print": lambda x: print(x),
        "remove": lambda x, y: x.remove(y),
        "append": lambda x, y: x.append(y),
        "sort": lambda x: x.sort(),
        "pop": lambda x: x.pop(),
        "reverse": lambda x: x.reverse(),
    }
    out = []
    for i in range(N):        
        a = input()
        split_a = a.split(' ')
        command = split_a[0]
        try:
            commands[command](out, int(split_a[1]), int(split_a[2]))
        except IndexError:
            try:
                commands[command](out, int(split_a[1]))
            except IndexError:
                commands[command](out)

Добро пожаловать в Stackoverflow и спасибо за помощь. Возможно, вы могли бы объяснить, почему удаление операторов if и elif поможет?

Tim 02.02.2021 17:31

Спасибо, Тим. Я лично стараюсь избегать как можно большего количества условных выражений «if» и «elif», потому что они часто используются слишком часто. Тем не менее, я использую их, когда у меня нет выбора. По моему опыту, попытки найти решения без использования «if» и «elif» помогают мне мыслить по-другому и научиться лучше подходить к определенным проблемам. Кроме того, когда дело доходит до модульного тестирования вашего кода, вам может потребоваться обрабатывать все условия, если это возможно, при использовании условных выражений. Например, для этого вопроса требуется 7+ условных выражений «if» и «elif». С моим подходом мне нужно проверить только 3 случая в моей попытке за исключением.

Erik Rosales 03.02.2021 19:34

Спасибо - ваше решение кажется более питоническим.

Tim 04.02.2021 13:24
N = int(input())
lst = []
for i in range(N):
    command = input().split()
    if command[0] == "print":
        print(lst)
    elif len(command) == 1:
        getattr(lst, command[0])()
    elif len(command) == 2:
        getattr(lst, command[0])(int(command[1]))
    else:
        getattr(lst, command[0])(int(command[1]), int(command[2]))

Очень креативная идея! Я обнаружил, что последние три случая elif/else можно упростить до else: getattr(lst, command[0])(*map(int, command[1:]))

AnnieFromTaiwan 22.03.2021 04:10
if __name__ == '__main__':
    N = int(input())
    l=[]

    for i in range(N):
        s=input().split("\n")
        for j in s:
            m=j.split()
            if m[0]= = "insert":
                l.insert(int(m[1]),int(m[2]))
            elif m[0]= = "print":
                print(l)
            elif m[0]= = "remove":
                l.remove(int(m[1]))
            elif m[0]= = "append":
                l.append(int(m[1]))
            elif m[0]= = "sort":
                l.sort()
            elif m[0]= = "pop":
                l.pop()
            elif m[0]= = "reverse":
                l.reverse()       

Добро пожаловать в СО. Ответы только на код вообще не рекомендуются. Пожалуйста, добавьте соответствующие детали к своим вопросам, чтобы другие также могли понять ваш ответ.

Muhammad Tariq 25.04.2021 19:30
x= int(input())
lst = []
for i in range(x):
    n = input()
    lst.append(n)
newlist=[]
for ele in lst:
    splitted = ele.split()
    if splitted[0] == "insert":
        newlist.insert(int(splitted[1]),splitted[2])

    elif splitted[0] == "print":
        print(newlist)

    elif splitted[0] == "remove":
        newlist.remove(splitted[1])

    elif splitted[0] == "append":
        newlist.append(splitted[1])

    elif splitted[0] == "sort":
        newlist.sort()

    elif splitted[0] == "pop":
        newlist.pop()

    elif splitted[0] == "reverse":
        newlist.reverse()

    else:
        print("Command out of Scope")

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

C. Fennell 14.05.2021 17:34
### You can try this one:
if __name__ == '__main__':
    n = int(input())
    num_list = []
    for _ in range(n):
        string = input().split()
        command = string[0]
        args = string[1:]
        if command != "print":
            command += "(" + ",".join(args) + ")"
            eval("num_list." + command)
        else:
            print(num_list)

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