0

次の例のようなエントリを含むテキスト ファイルがあります。

# 8 行のヘッダー
----------------------------------------------
123 ABC12345 もう少し可変長のテキスト
456 DEF12345 もう少し可変長のテキスト
789 GHI12345 B もう少し可変長テキスト
987 JKL12345 もう少し可変長のテキスト
654 MNO12345 B もう少し可変長テキスト
321 PQR12345 B もう少し可変長のテキスト
等...

私が達成したいことは次のとおりです。

  1. 2 進数にするために、A を 1 に、B を 0 に変換します。上記の例では、110100 (つまり AABABB) になります。
  2. この 2 進数を 10 進数に変換します。上の例の場合、これは 52 になります。
  3. この 10 進数をテキスト文字列にマップします (つまり、52 = "ケース 1" または 53 = "ケース 2" など)。
  4. これを標準出力に出力します

Python の経験は少しありますが、上記の問題は私の能力をはるかに超えています。したがって、コミュニティからの助けをいただければ幸いです。どうもありがとう、Hib

4

4 に答える 4

2

いくつかのポインタ (Python 2 を想定):

文字列の翻訳:

>>> import string
>>> table = string.maketrans("AB","10")
>>> translated = "AABABB".translate(table)
>>> translated
'110100'

基数 10 への変換:

>>> int(translated, 2)
52

それをそれらの任意の文字列にどのようにマップするかわかりません-より多くの情報が必要です。

印刷先stdout- 本当に?どの部分に問題がありますか?

于 2012-07-11T09:04:50.590 に答える
0

re受け入れられる行の形式を確認するために、モジュールを使用しました。

>>> def map_file_to_string(string):
    values = []
    for line in string.split('\n'):
        if re.match(r'\d{3} \w{3}\d{5} [AB] .*', line):
            values.append(1 if line[13] == 'A' else 0)
    return dict_map[int(''.join(map(str, values)), 2)]

>>> dict_map = {52: 'Case 1', 53: 'Case 2'}
>>> s1 = """# 8 rows of header
---------------------------------------------
123 ABC12345 A some more variable length text
456 DEF12345 A some more variable length text
789 GHI12345 B some more variable length text
987 JKL12345 A some more variable length text
654 MNO12345 B some more variable length text
321 PQR12345 B some more variable length text
etc.."""
>>> map_file_to_string(s1)
'Case 1'
>>> 
于 2012-07-11T09:19:24.133 に答える
0

このようなものが動作するはずです(テストされていません):

from itertools import islice

binary_map = dict(zip("AB", "10"))  # Equivalent to {"A": "1", "B": "0"}
string_map = {52: "Case 1", 53: "Case 2"}

with open("my_text_file") as f:
    binary_str = "".join(binary_map[x.split()[2]] for x in islice(f, 9, None))

binary_value = int(binary_string, 2)
print string_map[binary_value]

インデントされたコード行を分解して説明します。

  • 空の文字列のjoinメソッドは、引数で指定された文字列を連結するため、"".join(["A", "B", "C"])と等しくなり"ABC"ます。
  • このメソッドに、いわゆるジェネレーター式,を渡しX for Y in Zます。角括弧が省略されていることを除いて、リスト内包表記と同じ構文を持ちます。
  • このislice関数は、ファイル object の最初の 9 行をサイレントにスキップする反復子を返すfため、10 行目から始まる行が生成されます。
  • 引数のないのsplitメソッドはstr、空白文字 (スペース、タブ ( "\t")、ラインフィード ( "\n")、キャリッジ リターン ( "\r")) の任意のシーケンスで分割し、リストを返します。たとえば、" a \t b\n\t c\n".split()は に等しい['a', 'b', 'c']です。3 番目の列 に関心があります。x.split()[2]これは"A"または"B"です。
  • binary_map辞書でこの値を調べると、どちらか"1"または"0"代わりに表示されます。
于 2012-07-11T09:06:24.130 に答える
0

a.txt:

# 8 rows of header







123 ABC12345 A some more variable length text
456 DEF12345 A some more variable length text
789 GHI12345 B some more variable length text
987 JKL12345 A some more variable length text
654 MNO12345 B some more variable length text
321 PQR12345 B some more variable length text

あなたはこれを試すことができます:

>>> int(''.join([line.split(' ')[2] for line in open('a.txt', 'r').readlines()[8:]]).replace('A', '1').replace('B', '0'), 2)
>>> 52

int を文字列にマッピングすることについては、何を意味するのかわかりません。

>>> value = {int(''.join([line.split(' ')[2] for line in open('a.txt', 'r').readlines()[8:]]).replace('A', '1').replace('B', '0'), 2): 'case 52'}  
>>> value[52]
'case 52'
>>> 
于 2012-07-11T09:09:01.373 に答える