Python – попытка разделить int из строки

Я решаю задачи из CodeWars и пытаюсь решить одну из них.

У меня есть вопросы относительно одного из моих шагов по решению этой проблемы.

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

Вот моя попытка:

strg = "01|15|59, 1|47|6, 01|17|20, 1|32|34, 2|3|17"

def stat(strg):
    strg = [x.split() for x in strg.split(',')]

я ожидал

strg[0] = 01|15|59

но я получаю

strg[0] = 0

и я не понимаю почему, ведь я просил разделить на ",".

Дополнительный вопрос: Думая, я запутался... Согласно приведенному выше контексту, может ли кто-нибудь объяснить мне разницу между:

strg[0]
stat(strg[0])
stat[0]

Я распечатал разные результаты, чтобы посмотреть, но поскольку я создаю функцию, у меня возникнет соблазн использовать stat(strg[0]) или stat[0] вместо strg[0] для проверки первого значения списка?

У вас есть strg вне функции stat, а также внутри нее. Какой из них вы тестируете?

kojiro 31.05.2024 16:44

Я предполагал, что это будет то же самое, поскольку я объявляю переменную перед функцией, а затем использую ее внутри этой функции? strg не «обновляется» после входа в функцию? (также новый для Python)

g10 31.05.2024 16:47
stat(strg) должен return strg чтобы вы могли сделать strg_parts = stat(strg)
JonSG 31.05.2024 16:48

Вы можете просто использовать strg= strg.split(', ') (обратите внимание на пробел после запятой). Вы делите его на два раза. Вы также не изменяете исходную строку, потому что ваша функция ничего не возвращает.

greekman 31.05.2024 16:49
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
71
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

Вероятно, вы захотите вернуться из функции.

def stat(strg):
    return [x.split() for x in strg.split(',')]


>>> stat(strg)[0]
['01|15|59']

Главный вывод здесь — именование и привязка, часто называемые областью действия.

Я собираюсь переименовать для вас некоторые переменные, потому что думаю, что имена ваших переменных и область их существования сбивают вас с толку.

original_strg = "01|15|59, 1|47|6, 01|17|20, 1|32|34, 2|3|17"

def stat(temp_strg):
    return temp_strg.split(', ') # added a space after the comma

new_strg = stat(original_strg)
print(new_strg)

С тем, что у вас было, вот что пошло не так:

strg = "01|15|59, 1|47|6, 01|17|20, 1|32|34, 2|3|17"

def stat(strg): # this function doesn't return anything
    strg = [x.split() for x in strg.split(',')]
    # this will end up being strg = [['01|15|59'], ['1|47|6'], ['01|17|20'], ['1|32|34'], ['2|3|17']]

stat(strg) # this is only modifying strg within the stat function NOT the original

print(strg) # so this is printing the original

print(strg[0]) # this is just getting the first character of this original

print(stat(strg[0])) # this will end up being [['0']] because you're only giving it the first character of strg

print(stat[0]) # this isn't valid unless you did stat(strg)[0]
Ответ принят как подходящий

Вы не используете свою функцию stat. Кроме того, вам следует вернуться, а не изменять локальную переменную напрямую.

Функция split разбивает строку на список, где каждое слово является элементом списка, поэтому результатом уже является список.

strg = "01|15|59, 1|47|6, 01|17|20, 1|32|34, 2|3|17"

def stat(strg):
    return strg.split(',')

Результат функции stat:

>>> stat(strg) 
['01|15|59', ' 1|47|6', ' 01|17|20', ' 1|32|34', ' 2|3|17']

Вы можете забрать первый пункт списка:

>>> stat(strg)[0]
'01|15|59'

Чтобы ответить на Ваши дополнительные вопросы,

  • strg — это строковый объект, поэтому он работает как список символов. Если вы наберете strg[0], вы получите первый элемент строки.

    >>> strg[0]
    '0'
    
  • Ваша функция stat разделяет аргумент на ", ", но strg[0] не содержит ", ", поэтому функция stat возвращает список только с аргументом.

    >>> stat(strg[0])
    ['0']
    >>> stat(strg[0])[0]
    '0'
    
  • Наконец, функцию stat нужно к чему-то применить. Здесь вы хотите получить первый элемент функционального объекта, что невозможно.

    >>> stat
    <function stat at 0x00000264A22BB920>
    >>> stat[0]
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    TypeError: 'function' object is not subscriptable
    

с уважением,

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