19

「+123-456-7890」などの電話番号(文字列)があり、[+、1、2、3、-、....、0]のようなリストに変換したいと思います。

なんで?したがって、リストを繰り返し処理してすべての記号を削除できるので、数字のみのリストが残り、それを文字列に戻すことができます。

この問題を解決するための最良の方法は何ですか?数字の間に特殊文字がないため、私が遭遇した解決策はどれも適用できません(したがって、そこで文字列を分割することはできません)。

何か案は?ほんとうにありがとう!

編集-これは私が試したものです:

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

また:

filter(lambda x: x isdigit())
4

9 に答える 9

60

リスト(your_string)を作成します。

>>> s = "mep"
>>> list(s)
['m', 'e', 'p']
于 2013-03-20T14:50:36.290 に答える
9

あなたはあなたが次のようなものが欲しいということを意味します:

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

これは、文字列が反復可能であるという事実を使用しています。それらを繰り返すと、一度に1文字が生成されます。


あなたの努力に関して、

これは実際には文字列からすべての数字を削除し、数字以外の数字だけを残します。

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

これは、各文字の後ではなく、空白の実行時に文字列を分割します。

list = x.split()
于 2013-03-20T14:50:53.490 に答える
6
''.join(filter(str.isdigit, "+123-456-7890"))
于 2013-03-20T14:53:00.613 に答える
4

reモジュールを使用できます。

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

これにより、数字以外のすべてが''に置き換えられます。

于 2013-03-20T14:52:08.480 に答える
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最速のようです(問題は「これらの数字を取得する」ではなく「これらの2つの記号を無視する」と述べられており、かなり低レベルであると私は信じています)。

そしてのために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
于 2013-03-20T15:27:53.240 に答える
2

リストに変換する代わりに、最初の文字列を繰り返し処理し、見つけた各数字をその新しい文字列に追加して2番目の文字列を作成することができます。

于 2013-03-20T14:53:17.650 に答える
2

Python文字列文字のリストです。あなたは今それを繰り返すことができます!

justdigits = ""
for char in string:
    if char.isdigit():
        justdigits += str(char)
于 2013-03-20T14:50:51.460 に答える
2

list(x)を試しましたか??

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

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

于 2015-08-06T19:48:03.593 に答える
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:これは、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
于 2013-03-20T15:15:54.493 に答える