我有一个电话号码(字符串),例如“+ 123-456-7890”,我想变成一个看起来像这样的列表:[+,1,2,3, - ,....,0]。
为什么呢?所以我可以遍历列表并删除所有符号,所以我留下了一个只有数字的列表,然后我可以将其转换回字符串。
解决此问题的最佳方法是什么?我遇到的所有解决方案都不适用,因为我的数字之间没有任何特殊字符(所以我不能在那里拆分字符串。)
有什么想法吗?我真的很感激!
编辑 - 这是我尝试过的:
x = row.translate(None, string.digits)
list = x.split()
另外:
filter(lambda x: x isdigit())
答案 0 :(得分:59)
制作列表(your_string)。
>>> s = "mep"
>>> list(s)
['m', 'e', 'p']
答案 1 :(得分:8)
你的意思是你想要的东西:
''.join(n for n in phone_str if n.isdigit())
这使用字符串可迭代的事实。当你迭代它们时,它们一次产生1个字符。
关于你的努力,
这个实际上删除字符串中的所有数字,只留下非数字。
x = row.translate(None, string.digits)
这个字符串在空格的运行中分割,而不是在每个字符之后:
list = x.split()
答案 2 :(得分:6)
''.join(filter(str.isdigit, "+123-456-7890"))
答案 3 :(得分:4)
您可以使用re模块:
import re
re.sub(r'\D', '', '+123-456-7890')
这将用''。
替换所有非数字答案 4 :(得分:3)
我知道这个问题已得到解答,但只是要指出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
答案 5 :(得分:2)
python字符串是字符列表。你现在可以迭代它!
justdigits = ""
for char in string:
if char.isdigit():
justdigits += str(char)
答案 6 :(得分:2)
您可以通过将找到的每个数字字符添加到新字符串中来迭代第一个字符串并创建第二个字符串,而不是转换为列表。
答案 7 :(得分:1)
您是否尝试过list(x)??
y = '+123-456-7890'
c =list(y)
c
[' +',' 1',' 2',' 3',' - ' ,' 4',' 5',' 6',' - ',' 7',&#39 ; 8',' 9',' 0']
答案 8 :(得分: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'
N.b。:这不适用于Python2中的unicode字符串,或者根本不适用于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