Преобразовать строку (без разделителя) в список
У меня есть номер телефона (строка), например. "+ 123-456-7890", что я хочу превратить в список, который выглядит так: [+, 1, 2, 3, -,...., 0].
Почему? Поэтому я могу пройти итерацию по списку и удалить все символы, поэтому я остался со списком только цифр, который затем могу преобразовать обратно в строку.
Какой лучший способ решить эту проблему? Ни одно из решений, с которыми я сталкивался, применимо, потому что у меня нет специальных символов между цифрами (поэтому я не могу разбить эту строку там.)
Любые идеи? Я действительно ценю это!
Изменить - вот что я пробовал:
x = row.translate(None, string.digits)
list = x.split()
Также:
filter(lambda x: x isdigit())
Ответы
Ответ 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