2013-08-26 30 views
10

mam długi łańcuch, który jest w zasadzie lista jak str="lamp, bag, mirror," (i innych przedmiotów)Jak mogę odjąć dwa ciągi w pythonie?

Zastanawiałem się, czy mogę dodać lub odjąć kilka przedmiotów, w innych językach programowania można łatwo zrobić: str=str-"bag," i dostać str="lamp, mirror," ten nie działa w Pythonie (używam 2.7 na W8 PC)

Czy istnieje sposób, aby podzielić ciąg na powiedzieć "torba" i jakoś użyć tego jako odejmowanie? Potem wciąż muszę wymyślić, jak dodać.

+1

Kiedy mówisz "odejmij", masz na myśli usunięcie elementu z listy lub usunięcie ostatnich znaków, jeśli pasują (a jeśli nie, jakie powinno być zachowanie? A co z powielonymi wartościami? –

+1

Spójrz na ciąg znaków: http://docs.python.org/2/library/string.html#string.replace – kevmo314

+10

'w innych językach programowania mogę z łatwością zrobić: str = str-" bag "i uzyskać str = "lampa, lustro" "jakie języki? –

Odpowiedz

10

Można to robić tak długo, jak korzystać z dobrze uformowane list:

s0 = "lamp, bag, mirror" 
s = s0.split(", ") # s is a list: ["lamp", "bag", "mirror"] 

Jeśli lista nie jest dobrze wykształcona, można to zrobić w następujący sposób, zgodnie z sugestią @Lattyware:

s = [item.strip() for item in s0.split(',')] 

teraz, aby usunąć element:

s.remove("bag") 
s 
=> ["lamp", "mirror"] 

tak czy inaczej - zrekonstruować ciąg, użyj join():

", ".join(s) 
=> "lamp, mirror" 

Inne podejście byłoby użyć replace() - ale należy być ostrożnym z napisu, który chcesz zastąpić, na przykład "mirror" nie posiada z tyłu , na końcu.

s0 = "lamp, bag, mirror" 
s0.replace("bag, ", "") 
=> "lamp, mirror" 
+0

Warto wspomnieć o 'str.split()'. –

+0

Tak, miałem to zrobić :) –

+2

Oczywiście istnieje założenie, że lista jest dobrze sformułowana ze spacjami po każdym elemencie, jeśli tak nie jest, '[item.strip() dla elementu w s0.split (',')] 'jest bardziej elastyczny (proste [zrozumienie list] (http://www.youtube.com/watch?v=pShL9DCSIUw) za pomocą [' str.strip() '] (http : //docs.python.org/3/library/stdtypes.html#str.strip) metoda). –

1

powinieneś przekonwertować swój ciąg na listę ciągów, a następnie rób to, co chcesz. spojrzeć

my_list="lamp, bag, mirror".split(',') 
my_list.remove('bag') 
my_str = ",".join(my_list) 
+0

Po prostu używam jego nazwy zmiennej – dare

19

można też po prostu zrobić

print "lamp, bag, mirror".replace("bag,","") 
+2

Oczywiście, to działa inaczej niż w innych przykładach w przypadku duplikatów - OP nie podaje żadnego wyjaśnienia wymaganego zachowania w tym przypadku, ale warto o tym pamiętać. –

+1

dobry punkt ... tak naprawdę podział jest prawdopodobnie "poprawną" odpowiedzią, ale pomyślałem, że ją wyrzucę. nie wiesz, jakie języki obsługują odejmowanie ciągów lub jak zachowywałoby się w wymienionych językach. –

0

Korzystanie regularne przykład wyrażenie:

import re 

text = "lamp, bag, mirror" 
word = "bag" 

pattern = re.compile("[^\w]+") 
result = pattern.split(text) 
result.remove(word) 
print ", ".join(result) 
+1

Ogromna przesada dla tego zadania. Po co używać REs, gdy 'str.split()' robi dokładnie to, co jest potrzebne? –

+0

To tylko przykład, jak już powiedziałem. – badc0re

12

Jak o tym ?:

def substract(a, b):        
    return "".join(a.rsplit(b)) 
+1

To rozwiązanie jest dość eleganckie. – fralau

1

Jeśli masz dwa ciągi jak poniżej:

t1 = 'how are you' 
t2 = 'How is he' 

i chcesz odjąć te dwa ciągi następnie można użyć poniższy kod:

l1 = t1.lower().split() 
l2 = t2.lower().split() 
s1 = "" 
s2 = "" 
for i in l1: 
    if i not in l2: 
    s1 = s1 + " " + i 
for j in l2: 
    if j not in l1: 
    s2 = s2 + " " + j 

new = s1 + " " + s2 
print new 

wyjście będzie jak:

jesteś on jest

0

Za pomocą poniższego można dodać więcej słów do usunięcia (["bag", "mirror", ...])

(s0, to_remove) = ("lamp, bag, mirror", ["bag"]) 
s0 = ", ".join([x for x in s0.split(", ") if x not in to_remove]) 
=> "lamp, mirror"