2015-04-06 6 views
0

Я пытаюсь написать исключение функции, которое принимает строку и 2 необязательных аргумента. Первый необязательный аргумент (bad_characters) принимает букву, а третий аргумент (case_sensitive) принимает значение Boolean. Функция должна взять строку s и удалить все экземпляры bad_characters. Если case_sensitive истинно, тогда функция должна действовать с учетом регистра. Если false, тогда это не нужно. Это то, что у меня есть до сих пор.Удаление строчных букв из строки в Python

def eliminate(s,bad_characters = [],case_sensitive = True or False): 
    ''' Takes a string s and returns the string with all bad_characters 
    removed. If case_sensitive is True, then the function will only 
    remove uppercase letters if there are uppercase letters in 
    bad_characters. 
    String --> String''' 
    while True: 
     if case_sensitive = False: 
      for character in s: 
       if bad_characters == character: 
        newlist = s.replace(bad_characters,'') 
        return newlist 
     break 

Мне сложно определить, как заставить функцию удалять буквы в верхнем регистре, если это необходимо. Функция также должна работать, если bad_characters - это список, кортеж или строка.

+1

'Правда или false' ==' true'. Это ваше намерение? –

+0

Почему 'case_sensitive' удаляет только прописные буквы? это странно. Возможно, назовите его 'uppercase_only'? –

+0

Также попробуйте в консоли python следующее: '' A '==' a''. –

ответ

2

Ваша проблема заключается в том, чтобы пропустить понимание о str.replace, потому что оно просто заменяет один символ, поэтому вам нужно зациклиться на bad_characters и удалить их по одному.

SO вместо == вы можете просто использовать in операнд, для проверки членства, а затем удалить character из вашей строки:

def eliminate(s,bad_characters = '',case_sensitive = False): 
    ''' Takes a string s and returns the string with all bad_characters 
     removed. If case_sensitive is True, then the function will only 
     remove uppercase letters if there are uppercase letters in 
     bad_characters. 
     String --> String''' 
    if case_sensitive == False: 
     for character in s: 
      if character in bad_characters: 
       s = s.replace(character,'') 
     return s 

И как более вещим способ для удаления специальных символов из строки вы можно использовать str.translate метод:

s.translate(None,bad_characters) 
+1

Метод перевода - это * Pythonic способ сделать это. +1 для упоминания об этом, а также для решения проблемы OP. Хотя я бы исправил параметр «True or False» и улучшил «bad_characters =», особенно когда мы обсуждаем «Pythonic». –

+0

@OliverW. Pythonic способ нас не о решении OP в любом случае спасибо, за напоминание исправлено !;) – Kasramvd

+1

@Kasra IndentationError! –

-2
def eliminate(s, bad_characters = [], case_sensitive=True): 
    for character in bad_characters: 
     if not case_sensitive: 
      s = s.replace(character.lower(),'') 
      s = s.replace(character.upper(),'') 
     else: 
      s = s.replace(character,'') 
    return s 
0

Вы можете использовать очень удобный str.swapcase функция здесь. Обратите внимание, что приведенный ниже код переопределяет bad_characters для наглядности, но вы можете легко изменить его, чтобы он не изменился.

def eliminate(s, bad_characters, case_sensitive):  
    if not case_sensitive: 
     bad_characters += map(str.swapcase, bad_characters) 
    return ''.join([c for c in list(s) if c not in bad_characters]) 

print eliminate('AaBb', ['a'], False)  
print eliminate('AaBb', ['a'], True)  
print eliminate('AaBb', ['A'], True) 

Bb 
ABb 
aBb 
0
a = 'AbCdEfG' 
print(''.join([x[0] for x in zip(a, a.upper()) if x[0] != x[1]])) 
# bdf 
+0

Это не читаемо, возможно, трудно поддерживать, если изменения потребуются, и это не относится к аргументу pass in ('case_sensitive'). –

2

Вы можете использовать string.translate (python2).

string.translate (с, таблица [, deletechars])

Удалить все символы из S, которые находятся в deletechars (если они присутствуют), а затем перевести символы с помощью таблицы, которая должна быть 256- символьная строка, дающая перевод для каждого символьного значения, индексированная его порядковым номером. Если таблица None, то выполняется только шаг удаления символа.

Другие ошибки в коде:

  • Initialize case_sensitive только с True. True or False есть True.
  • While True затем break ничего не добавляет. Убери это.
  • if case_sensitive = False: - это задание, в то время как вам нужно сравнить ==. case_sensitive является логическим, поэтому просто используйте его if case_sensitive или if not case_sensitive.
  • bad_characters == character неправ. Вы не можете сравнить список с персонажем. вместо этого используйте character in bad_characters.

Вот весь раствор с исправлениями:

def eliminate(s, bad_characters = [], case_sensitive = True): 
    if case_sensitive: #True 
     return s.translate(None, "".join(bad_characters)) 
    else: 
     s = s.translate(None, "".join(bad_characters).lower()) 
     s = s.translate(None, "".join(bad_characters).upper()) 
     return s 
Смежные вопросы