Чи є спосіб замінити рядок у Python, щоб отримати нову рядок від третього символу до кінця рядка?
Може, як myString[2:end]
?
Якщо вийти з другої частини означає «до кінця», а якщо ви залишите першу частину, це починається з початку?
Чи є спосіб замінити рядок у Python, щоб отримати нову рядок від третього символу до кінця рядка?
Може, як myString[2:end]
?
Якщо вийти з другої частини означає «до кінця», а якщо ви залишите першу частину, це починається з початку?
Відповіді:
>>> x = "Hello World!"
>>> x[2:]
'llo World!'
>>> x[:2]
'He'
>>> x[:-2]
'Hello Worl'
>>> x[-2:]
'd!'
>>> x[2:-2]
'llo Worl'
Python називає це поняття "нарізкою", і воно працює на більш ніж просто рядках. Погляньте тут на всебічне вступ.
Тільки для повноти, як ніхто інший цього не згадував. Третій параметр для фрагмента масиву - це крок. Тож обертання рядка настільки ж просто, як:
some_string[::-1]
Або вибір альтернативних символів буде таким:
"H-e-l-l-o- -W-o-r-l-d"[::2] # outputs "Hello World"
Можливість крокувати вперед і назад по рядку підтримує послідовність з можливістю масиву фрагмента з початку або в кінці.
Substr () зазвичай (тобто PHP і Perl) працює таким чином:
s = Substr(s, beginning, LENGTH)
Отже параметри є beginning
і LENGTH
.
Але поведінка Пітона інша; він очікує початку і один після END (!). Це початківцям важко помітити. Тож правильна заміна Substr (s, початок, LENGTH) є
s = s[ beginning : beginning + LENGTH]
s[beginning:][:length]
Поширений спосіб досягти цього - нарізання струн.
MyString[a:b]
дає підрядку від індексу a до (b - 1).
Один приклад, здається, тут відсутній: повна (неглибока) копія.
>>> x = "Hello World!"
>>> x
'Hello World!'
>>> x[:]
'Hello World!'
>>> x==x[:]
True
>>>
Це загальна ідіома для створення копії типів послідовностей (НЕ інтернованих рядків), [:]
. Дрібно копіює список, див. Синтаксис фрагмента списку Python, який використовується без очевидних причин .
a=b
має бути достатнім.
[:]
непорушний тип взагалі не робить копію. Хоча mysequence[:]
в основному нешкідливо , коли mysequence
непорушний тип , як str
, tuple
, bytes
(PY3) або unicode
(py2), a = b[:]
еквівалентно a = b
, він просто витрачає мало часу диспетчерської кодів байт нарізки яких об'єкт реагує, повертаючи себе , так як це безглуздо для дрібного копіювання , коли , окрім тестів на предмет ідентичності об'єкта, це рівносильно просто повернути ще одне посилання на своє незмінне «я».
s[:]
робить копію на всіх: s = 'abc'; s0 = s[:]; assert s is s0
. Так, це був ідіоматичний спосіб копіювання списку в Python, поки списки не отримали list.copy
, але повний фрагмент непорушного типу не має підстав робити копію, оскільки його неможливо змінити, тому в пам'яті може бути лише один ми не повинні витрачати час на його копіювання. Оскільки ця відповідь неправильна і навіть не відповідає на питання - чи її слід видалити?
Чи існує спосіб підстрочки рядка в Python, щоб отримати нову рядок від 3-го символу до кінця рядка?
Може, як
myString[2:end]
?
Так, це на самому справі працює , якщо ви призначите або зв'язати , ім'я, end
для постійного одноточечного, None
:
>>> end = None
>>> myString = '1234567890'
>>> myString[2:end]
'34567890'
Позначення фрагмента має 3 важливі аргументи:
Вони за замовчуванням не даються None
- але ми можемо їх чітко передати:
>>> stop = step = None
>>> start = 2
>>> myString[start:stop:step]
'34567890'
Якщо залишити другу частину означає «до кінця», якщо ви залишите першу частину, чи починається вона з початку?
Так, наприклад:
>>> start = None
>>> stop = 2
>>> myString[start:stop:step]
'12'
Зауважте, що ми включаємо старт у фрагмент, але ми лише піднімаємось до, а не включаючи зупинку.
Коли кроком є None
, за замовчуванням фрагмент використовується 1
для кроку. Якщо ви перейдете з негативним цілим числом, Python досить розумний, щоб пройти від кінця до початку.
>>> myString[::-1]
'0987654321'
Я пояснюю позначення фрагментів дуже докладно у своїй відповіді на Пояснення запитання про фрагменти.
Я хотів би додати до дискусії два моменти:
Ви можете використовувати None
на порожньому просторі, щоб вказати "від початку" або "до кінця":
'abcde'[2:None] == 'abcde'[2:] == 'cde'
Це особливо корисно у функціях, де ви не можете надати порожній простір як аргумент:
def substring(s, start, end):
"""Remove `start` characters from the beginning and `end`
characters from the end of string `s`.
Examples
--------
>>> substring('abcde', 0, 3)
'abc'
>>> substring('abcde', 1, None)
'bcde'
"""
return s[start:end]
У Python є об'єкти зрізу :
idx = slice(2, None)
'abcde'[idx] == 'abcde'[2:] == 'cde'
Якщо туЗЬптд містить номер рахунку , який починається зі зміщенням 6 і має довжину 9, то ви можете отримати номер банківського рахунку , таким чином: acct = myString[6:][:9]
.
Якщо ОП приймає це, вони можуть спробувати спробувати експериментальним шляхом,
myString[2:][:999999]
Це працює - помилка не піднімається, і не виникає "забивка рядків" за замовчуванням.
myString[offset:][:length]
у випадку з ОП, ви можете просто скористатисяmyString[offset:][:]
Можливо, я пропустив це, але я не зміг знайти повної відповіді на цій сторінці на оригінальні питання, тому що змінні тут далі не обговорюються. Тому мені довелося продовжувати пошуки.
Оскільки мені поки що не можна коментувати, дозвольте тут додати свій висновок. Я впевнений, що я не був єдиним, хто зацікавився цим доступом до цієї сторінки:
>>>myString = 'Hello World'
>>>end = 5
>>>myString[2:end]
'llo'
Якщо ви залишите першу частину, ви отримаєте
>>>myString[:end]
'Hello'
І якщо ви залишили: у середині ви також отримали найпростішу підрядку, яка була б 5-м символом (рахуйте, починаючи з 0, тож у цьому випадку це порожнє):
>>>myString[end]
' '
Ну, у мене виникла ситуація, коли мені потрібно було перекласти PHP-скрипт на Python, і це було багато звичаїв substr(string, beginning, LENGTH)
.
Якби я вибрав Python's, string[beginning:end]
я повинен був би обчислити багато кінцевих індексів, тому більш простим способом було використання string[beginning:][:length]
, це врятувало мені багато клопоту.
Використання твердо кодованих індексів само по собі може бути безладно.
Щоб уникнути цього, Python пропонує вбудований об’єкт slice()
.
string = "my company has 1000$ on profit, but I lost 500$ gambling."
Якщо ми хочемо знати, скільки грошей у мене залишилось.
Звичайне рішення:
final = int(string[15:19]) - int(string[43:46])
print(final)
>>>500
Використання скибочок:
EARNINGS = slice(15, 19)
LOSSES = slice(43, 46)
final = int(string[EARNINGS]) - int(string[LOSSES])
print(final)
>>>500
Використовуючи фрагмент, ви отримуєте читабельність.