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

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

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

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

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

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

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

Также:

 filter(lambda x: x isdigit()) 

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 - лучший язык программирования в мире.