Преобразовать строку (без разделителя) в список

У меня есть номер телефона (строка), например «+ 123-456-7890», который я хочу превратить в список, который выглядит следующим образом: [+, 1, 2, 3, -, …., 0].

Зачем? Поэтому я могу пройти итерацию по списку и удалить все символы, поэтому мне остался список только цифр, который затем можно преобразовать обратно в строку.

Каков наилучший способ решить эту проблему? Ни одно из решений, с которыми я сталкивался, применимо, потому что у меня нет специальных символов между цифрами (поэтому я не могу разбить строку там.)

Есть идеи? Я очень ценю это!

Изменить – вот что я пробовал:

x = row.translate(None, string.digits) list = x.split() 

Также:

 filter(lambda x: x isdigit()) 

  • Объединение элемента в список строк
  • Извлечение слов из строки, удаление знаков препинания и возврат списка с выделенными словами в Python
  • Преобразовать строку в список на Python без использования Eval?
  • Техника сравнения строк, используемая Python
  • Получить список из String Python
  • Проверка соответствия строк и списка
  • скрытая строка, которая является списком в правильный список python
  • Ошибка генерирования create_string_buffer ТипError: ожидаемая строка / байты вместо str instance
  • 9 Solutions collect form web for “Преобразовать строку (без разделителя) в список”

    Вы имеете в виду, что хотите что-то вроде:

     ''.join(n for n in phone_str if n.isdigit()) 

    Это использует тот факт, что строки являются итерабельными. Они дают 1 символ в то время, когда вы перебираете их.


    Что касается ваших усилий,

    Этот фактически удаляет все цифры из строки, оставляя вас только без цифр.

     x = row.translate(None, string.digits) 

    Он разделяет строку на пробелы пробелов, а не после каждого символа:

     list = x.split() 

    Составьте список (your_string) .

     >>> s = "mep" >>> list(s) ['m', 'e', 'p'] 
     ''.join(filter(str.isdigit, "+123-456-7890")) 

    Вы можете использовать модуль re:

     import re re.sub(r'\D', '', '+123-456-7890') 

    Это заменит все не-цифры на «.

    Строка python представляет собой список символов. Вы можете перебирать его прямо сейчас!

     justdigits = "" for char in string: if char.isdigit(): justdigits += str(char) 

    Я знаю, что на этот вопрос был дан ответ, но просто для того, чтобы указать, что timeit говорит об эффективности решений. Используя эти параметры:

     size = 30 s = [str(random.randint(0, 9)) for i in range(size)] + (size/3) * ['-'] random.shuffle(s) s = ''.join(['+'] + s) timec = 1000 

    Это «номер телефона» имеет 30 цифр, 1 плюс пение и 10 '-'. Я тестировал эти подходы:

     def justdigits(s): justdigitsres = "" for char in s: if char.isdigit(): justdigitsres += str(char) return justdigitsres re_compiled = re.compile(r'\D') print('Filter: %ss' % timeit.Timer(lambda : ''.join(filter(str.isdigit, s))).timeit(timec)) print('GE: %ss' % timeit.Timer(lambda : ''.join(n for n in s if n.isdigit())).timeit(timec)) print('LC: %ss' % timeit.Timer(lambda : ''.join([n for n in s if n.isdigit()])).timeit(timec)) print('For loop: %ss' % timeit.Timer(lambda : justdigits(s)).timeit(timec)) print('RE: %ss' % timeit.Timer(lambda : re.sub(r'\D', '', s)).timeit(timec)) print('REC: %ss' % timeit.Timer(lambda : re_compiled.sub('', s)).timeit(timec)) print('Translate: %ss' % timeit.Timer(lambda : s.translate(None, '+-')).timeit(timec)) 

    И вышел с этими результатами:

     Filter: 0.0145790576935s GE: 0.0185861587524s LC: 0.0151798725128s For loop: 0.0242128372192s RE: 0.0120108127594s REC: 0.00868797302246s Translate: 0.00118899345398s 

    По-видимому, GE и LC все еще медленнее, чем регулярное выражение или скомпилированное регулярное выражение. И, по-видимому, мой CPython 2.6.6 не очень оптимизировал добавление строки. translate представляется наиболее быстрым (что ожидается, поскольку проблема заявлена ​​как «игнорировать эти два символа», а не «получить эти цифры», и я считаю, что это довольно низкий уровень).

    И для size = 100 :

     Filter: 0.0357120037079s GE: 0.0465779304504s LC: 0.0428011417389s For loop: 0.0733139514923s RE: 0.0213229656219s REC: 0.0103371143341s Translate: 0.000978946685791s 

    И для size = 1000 :

     Filter: 0.212141036987s GE: 0.198996067047s LC: 0.196880102158s For loop: 0.365696907043s RE: 0.0880808830261s REC: 0.086804151535s Translate: 0.00587010383606s 

    Вместо преобразования в список вы можете просто перебрать первую строку и создать вторую строку, добавив каждый символ цифры, который вы найдете в эту новую строку.

    Вы попробовали список (x)?

      y = '+123-456-7890' c =list(y) c 

    ['+', '1', '2', '3', '-', '4', '5', '6', '-', '7', '8', '9', ' 0' ]

    Вы можете использовать str.translate , вам просто нужно дать ему правильные аргументы:

     >>> dels=''.join(chr(x) for x in range(256) if not chr(x).isdigit()) >>> '+1-617-555-1212'.translate(None, dels) '16175551212' 

    Nb: Это не будет работать с строками unicode в Python2 или вообще в Python3. В этих средах вы можете создать собственный класс для перехода к unicode.translate :

     >>> class C: ... def __getitem__(self, i): ... if unichr(i).isdigit(): ... return i ... >>> u'+1-617.555/1212'.translate(C()) u'16175551212' 

    Это также работает с цифрами, отличными от ASCII:

     >>> print u'+\u00b9-\uff1617.555/1212'.translate(C()).encode('utf-8') ¹6175551212 
    Python - лучший язык программирования в мире.