Dzielenie ostatniego separatora w ciągu Python?


203

Jaki jest zalecany idiom Pythona do dzielenia łańcucha przy ostatnim wystąpieniu ogranicznika w łańcuchu? przykład:

# instead of regular split
>> s = "a,b,c,d"
>> s.split(",")
>> ['a', 'b', 'c', 'd']

# ..split only on last occurrence of ',' in string:
>>> s.mysplit(s, -1)
>>> ['a,b,c', 'd']

mysplitprzyjmuje drugi argument, którym jest występowanie separatora do podzielenia. Podobnie jak w przypadku zwykłego indeksowania list, -1oznacza ostatni od końca. Jak można to zrobić?

Odpowiedzi:


355

Użyj .rsplit() lub .rpartition()zamiast:

s.rsplit(',', 1)
s.rpartition(',')

str.rsplit()pozwala określić, ile razy podzielić, podczas gdy str.rpartition()dzieli tylko raz, ale zawsze zwraca stałą liczbę elementów (przedrostek, separator i postfiks) i jest szybszy w przypadku pojedynczego podziału.

Próbny:

>>> s = "a,b,c,d"
>>> s.rsplit(',', 1)
['a,b,c', 'd']
>>> s.rsplit(',', 2)
['a,b', 'c', 'd']
>>> s.rpartition(',')
('a,b,c', ',', 'd')

Obie metody rozpoczynają dzielenie od prawej strony łańcucha; podając str.rsplit()maksimum jako drugi argument, możesz podzielić tylko te zdarzenia, które najczęściej pojawiają się po prawej stronie.



5

Zrobiłem to dla zabawy

    >>> s = 'a,b,c,d'
    >>> [item[::-1] for item in s[::-1].split(',', 1)][::-1]
    ['a,b,c', 'd']

Uwaga : zapoznaj się z pierwszym komentarzem poniżej, w którym odpowiedź może się nie powieść.


2
„tylko dla zabawy”, ale także bardzo źle, ponieważ jeśli separator nie jest tylko pojedynczym znakiem lub powtarzającą się postacią, twoje podziały wybiorą co najwyżej niewłaściwe punkty do podziału.
— Martijn Pieters
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.