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.