Преобразовать строку (без разделителя) в список - программирование
Подтвердить что ты не робот

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

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

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

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

Любые идеи? Я действительно ценю это!

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

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

Также:

filter(lambda x: x isdigit())
4b9b3361

Ответ 1

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

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

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


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

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

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

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

list = x.split()

Ответ 2

Сделайте список (your_string).

>>> s = "mep"
>>> list(s)
['m', 'e', 'p']

Ответ 3

''.join(filter(str.isdigit, "+123-456-7890"))

Ответ 4

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

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

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

Ответ 5

Я знаю, что на этот вопрос был дан ответ, но просто для того, чтобы указать, что 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

Ответ 6

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

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

Ответ 7

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

Ответ 8

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

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

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

Ответ 9

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

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

N.b.: Это не будет работать с строками 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