1
def ints(filename):
    a = []
    f = open(filename, "r")
    lines = f.readlines()
    f.close()
    for line in lines:
        numbers = line.split()
        for number in numbers:            
            a.append(int(number))
    return a

これはこれまでの私の関数です。整数と「x」や「b」などの文字を含むファイルを読み取り、整数のみのリストを返すことができるようにしたいと考えています。現時点では、関数は整数を含むファイルのみを処理できます。

これを変更して文字または文字を除外するにはどうすればよいですか?

4

8 に答える 8

4

これはあなたのコードを編集したもので、期待どおりに動作します。

  def ints(filename):
        """A function that takes the filename of a file as an input arguement, computs and returns a list of
        integers of all the numbers in the file."""
        a = []
        f = open(filename, "r")
        lines = f.readlines()
        f.close()
        for line in lines:
            for character in line:
                try:
                    a.append(int(character))
                except ValueError:
                    pass
        return a
于 2013-01-16T17:10:06.983 に答える
2

regexここで役立ちます:

簡単な例:

In [22]: import re

In [23]: strs="121 some 34useless text 56"

In [24]: map(int,re.findall("\d+",strs))
Out[24]: [121, 34, 56]

# or this If you want the individual digits:

In [40]: map(int,re.findall("\d",strs))
Out[40]: [1, 2, 1, 3, 4, 5, 6]

あなたのコードでは、これはうまくいくはずです:

for line in lines:
    numbers = map(int,re.findall("\d+",line))
    a.extend(numbers)
于 2013-01-16T17:09:32.853 に答える
1

文字が数字かどうかを簡単にテストしました:

sample_string = "Test4. 2325This string3"
a_list = []
for x in sample_string:
    if x.isdigit():
        a_list.append(x)
于 2013-01-16T17:17:42.363 に答える
0

string.translateなどを使用して、数字以外のすべてをスペースに置き換えてから、split()とmap()の機能を活用してはどうでしょうか。

確かにそれは少しあいまいで、私のデフォルトの応答は、reモジュールを使用することです。全体として、正規表現でできることはたくさんあるので、学習する価値があります。

In [119]: import string
In [120]: allchars = string.maketrans('', '')
In [121]: delchars = allchars.translate(allchars, "0123456789")
In [122]: emptychars = string.maketrans(delchars, ' ' * len(delchars))
In [123]: "Welcome home 1234 56 ol".translate(emptychars)
Out[123]: '             1234 56   '
In [124]: "Welcome home 1234 56 ol".translate(emptychars).split()
Out[124]: ['1234', '56']
In [125]: map(int, "Welcome home 1234 56 ol".translate(emptychars).split())
Out[125]: [1234, 56]
于 2013-01-16T17:43:19.410 に答える
0

トライ/キャッチが役立つかもしれません:

for thing in line.split():
    i_thing = None
    try:
        i_thing = int(thing)
    except ValueError:
        pass

    s_thing = None
    try:
        s_thing = str(thing)
    except:
        raise Exception("OH NOES!")

それはかなり醜いですが、あなたがやろうとしていることを行うためのより良い方法を見つけていません.

于 2013-01-16T17:13:36.120 に答える
0

これはテストされていない sudo コードですが、有効なはずです。また、私ができる最善のアドバイスは、David Beazley の「システム プログラマー向けのジェネレーターの秘訣」と「Python 3 I/O のマスター」の講演を視聴することです。彼らはPythonを学ぶ上で大きな助けになりました。

これは、ファイルの各行を取得し、後でファイルを閉じる単純なジェネレータです。

def getLine(fileName):
    file = open(fileName, "r")

    for line in file.readLines():
        yield line

    file.close()


def getNumbers(line):
// I'm lazy and stole this one from Keith
    for number in line.split():
        try:
            yield int(number)
        except ValueError:
            pass

def generatorChain(fileName):
    // I'm a little iffy on the syntax here, but shouldn't be to hard with a bit of googling
    fileGen = getLine(fileName);
    yield getNumber( fileGen.next() ).next()

def listCompressionMagic():
    return [x for x in generatorChain("foo.txt") ]
于 2013-01-16T18:07:12.747 に答える
0

より現代的な Python イディオムの使用:

def ints(filename):
    with open(filename, "r") as f:
        for line in f:
            for number in line.split():
                try:
                    yield int(number)
                except ValueError:
                    pass


a = list(ints("testdata.txt"))
print(a)

基本的に、文字列が 10 進数でない場合は ValueError を発生させる int への変換を試みます。それを捕まえて無視し、続けてください。

于 2013-01-16T17:18:11.900 に答える
0
for number in numbers:
    try:
        a.append(int(number))
    except ValueError:
        pass
于 2013-01-16T17:10:49.667 に答える