いちばん失敗した人決定戦

スミマセン、書いています言語はpythonですが
pythonご存じないかたでも、アルゴリズム?の
問題ですので、教えて頂きたいと思います。

いま、

あ い う A
あ い う B
あ い う C
え お A
え お C



というデータを

あ い う A・B・C
え お A・C

という具合にまとめたいと思っています。

1行あたりのデータの処理は

data = f.readline()
data_1 = data.rsplit(None,1)

として、右側から空白1つをsplitして
data_1[0] は あ い う
data_1[1] は A
と取り出せるのですけれども、
A・B・Cの作り方で悩んでいます


あ い う B
あ い う C
は消して
あ い う A・B・C
として残したいです

A 回答 (7件)

No1の方の考え方通りで、辞書データとして扱えば、シンプルになるかと。



data_list = ['あ い う A', 'あ い う B', 'あ い う C', 'え お A', 'え お C']
result = dict()

for data in data_list:
 data_1 = data.rsplit(None,1)
 try:
  result[f'{data_1[0]}'] = f'{result[data_1[0]]}・{data_1[1]}'
 except KeyError:
  result[f'{data_1[0]}'] = f'{data_1[1]}'

print(result)
    • good
    • 0
この回答へのお礼

ありがとうございます。
ちょこっと変数名を変えさせて頂きましたが
下記内容で動きましたです

input_file = 'tmp_txt.txt'

f = open(input_file, 'r', encoding='UTF-8')
data_list = f.readlines()
f.close()

result = dict()

for data in data_list:
data_1 = data.rstrip('\r\n')
data_2 = data_1.rsplit(None,1)
try:
result[f'{data_2[0]}'] = f'{result[data_2[0]]}・{data_2[1]}'
except KeyError:
result[f'{data_2[0]}'] = f'{data_2[1]}'

kekka = ''

for t, n in result.items():

kekka += t + ' ' + n + '\r\n'

print (kekka)

お礼日時:2025/02/17 15:27

列の値がが同じデータは、1つのかたまりになってますか。


(連続した行になってますか。)

例えば、以下のようなケースの場合は、どうなりますか。

あ い う A
え お A
あ い う B
え お C
あ い う C

上記のような場合でも
あ い う A・B・C
え お A・C
のようにまとめたいのでしょうか。
    • good
    • 0

これ、「報告書作成問題」ってやつだよね。


古典的な入力構造と出力構造のミスマッチに関する問題のひとつ。
データ行をクラスタごとにまとめてヘッダとフッタを付けるんだけど、
次のクラスタが来るまで今のクラスタが終わったかどうか判らないから、
フッタ行を作成するときに一度
次クラスタの先頭行はプッシュバックしないといけなくて
行単位のバッファリングが必要になるってやつ。
古きよきワインバーグの本なんかに解説があった。
質問のプログラムの要点はそこ。

それに比べれば、文字列をどうやってアペンドするかなんて
アルゴリズムじゃなく、ライブラリの使用法の話に過ぎない。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2025/02/17 15:28

データが以下のようになっていた場合は、どのようにまとめるのでしょうか。


あ い う A a
あ い う B b
あ い う C c
え お D d 1
え お E e 2
    • good
    • 0
この回答へのお礼

ありがとうございます。
そうならないので大丈夫です。

お礼日時:2025/02/17 15:25

あ〜、ちなみに、だ。


考え方としては#1氏の言う通りなんだけど、実はこのアルゴリズム。
基本的には「圧縮」アルゴリズムの基礎と言われている「ランレングス圧縮」と考え方は全く同じなんだ。

ランレングス圧縮(連長圧縮):
https://ja.wikipedia.org/wiki/%E9%80%A3%E9%95%B7 …

よって、アルゴリズム的に理解したい、ってのならランレングス圧縮あるいは連長圧縮で検索してみればいい。
また、事実上、Pythonのitertools.groupbyと言う関数も、結果、ランレングス圧縮と同じアルゴリズムを採用している。

itertools.groupby:
https://docs.python.org/ja/3.13/library/itertool …
    • good
    • 0
この回答へのお礼

ありがとうございます。
Wiki見させて頂きましたけれど
難しいです…

お礼日時:2025/02/17 15:25
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2025/02/17 15:23

こんにちは



pythonは存じませんけれど、考え方でも良いのなら・・

連想配列が使えると思いますので、keyを「あ い う」、valueを「A」として格納してゆけばすむと思われます。

value値に配列を使えるのなら、そのままpushして、最後にjoinすればよさそうです。
配列が使えない場合は、最初は「A」を格納。既にkeyが存在する場合には「・B」を追加する・・といった考え方でできるのではないでしょうか?
(最初から一律に「・A」を追加して行って、最後に先頭一文字を削除でも可能かと)

上記の処理を、行数分繰り返せばよさそうに思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2025/02/17 15:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A