質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

3回答

1568閲覧

intとstrが混合する行の結合と操作

tkgene

総合スコア13

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/10/01 04:02

編集2020/10/01 06:03

Python3を使ってゲノム解析をしている初心者です。

2ファイルの1列目を比較して、一致したら結合するという作業をしています。
単純な一致と結合だけなら簡単なのですが、結合した後に引き算をしたり、
listにあってdataにない場合でも0埋めして出力したいです。
また、各行にはゲノム配列(str)と数字(int)混合しています。
listとdataの中の行の順番はばらばらです。ここでは見やすいように数行だけソートしてのせてあります。
append()を使っていろいろやってみたのですがうまく進まなくて困っています。
どなたかご教授お願いします。
以下に試したスクリプトを乗せております。

list_file.txt'''
TTTTCTC 2219
TGCATGC 2143
GCATGCA 2140
TTTTTCT 2098
TTTTTTC 2098
TTTCTCT 1821
'''

data_file.txt'''
TTTTCTC 40
TGCATGC 21
GCATGCA 20
TTTTTCT 98
'''

やりたいこと
1列目を元に一致したら結合し、dataの2列目はそのまま出力、listの2列目はdataの2列目を引いた値を出力。さらに、listにあってdataにない場合は0で埋めて出力。

#期待する出力 TTTTCTC 40 2279 TGCATGC 21 2122 GCATGCA 20 2120 TTTTTCT 98 2000 TTTTTTC 0 2098 TTTCTCT 0 1821

試したスクリプト

list = [] data = [] with open('list_file.txt', 'r') as c: for line in c: if type(line) == str: list.append(int(line.split())) else: list.append(line.split()) with open('data_file.txt', 'r') as f: for line in f: if type(line) == str: data.append(int(line.split())) else: data.append(line.split()) for c in tss_list: for f in gene_list: if c[0] == f[0]: #print(f[0]) print(c[0],"\t",c[1],"\t",c[1] - c[2],) elif c[0] in f[0]: print(c[0],"\t",c[1],"\t", 0 )

エラー

TypeError Traceback (most recent call last)
<ipython-input-48-553a02782dd4> in <module>
9 for line in c:
10 if type(line) == str:
---> 11 list.append(int(line.split()))
12 else:
13 list.append(line.split())

TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'

これはそもそもappendを使うのが間違っているのでしょうか。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2020/10/01 04:17

質問のコードは別の箇所でエラーが出ますが、実際に試されたコードと同じものですか? 質問のエラーが再現するコードの提示をお願いします。
nto

2020/10/01 04:20

specific_list、list_nonspec、tss_list、gene_list これらはどこでどの様に定義されているのでしょうか?
guest

回答3

0

pandasのmerge使うと大分楽ができるケースではあるので載せておきます。

python

1import pandas as pd 2from io import StringIO 3 4s1 = '''TTTTCTC 2219 5TGCATGC 2143 6GCATGCA 2140 7TTTTTCT 2098 8TTTTTTC 2098 9TTTCTCT 1821 10''' 11 12list_df = pd.read_csv(StringIO(s1), header=None, sep='\s+').rename(columns={1:2}) 13 14s2 = '''TTTTCTC 40 15TGCATGC 21 16GCATGCA 20 17TTTTTCT 98 18''' 19 20data_df = pd.read_csv(StringIO(s2), header=None, sep='\s+') 21 22# list_dfとdata_dfのマージ 23dfr = pd.merge(list_df, data_df, on=0, how='outer').reindex(columns=[0, 1, 2]).fillna(0).astype({1: 'int8'}) 24# 列2から列1の値を引く 25dfr[2] = dfr[2] - dfr[1] 26 27buffer = StringIO() 28dfr.to_csv(buffer, header=False, index=False, sep='\t') 29print(buffer.getvalue()) 30''' 31TTTTCTC 40 2179 32TGCATGC 21 2122 33GCATGCA 20 2120 34TTTTTCT 98 2000 35TTTTTTC 0 2098 36TTTCTCT 0 1821 37'''

投稿2020/10/01 04:51

yureighost

総合スコア2183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tkgene

2020/10/01 23:02

ありがとうございます。Pandasで各行を操作するときはこのように書くのですね。 勉強になります。
guest

0

ベストアンサー

lstやdataの形がどういった形なのかわからないので推測した形でのデータとなってしまいますが
以下の様にし、if文で文字列が含まれているかどうかを判定し処理を分ける事で目的の形に出力出来ます。

python

1lst = ['TTTTCTC 2219', 2 'TGCATGC 2143', 3 'GCATGCA 2140', 4 'TTTTTCT 2098', 5 'TTTTTTC 2098', 6 'TTTCTCT 1821'] 7data = ['TTTTCTC 40', 8 'TGCATGC 21', 9 'GCATGCA 20', 10 'TTTTTCT 98'] 11 12mold = {} 13for d in data: # data内容を分割し辞書型に 14 key, value = d.split() 15 mold[key] = int(value) 16for l in lst: 17 string, digit = l.split() # 文字列と数字列を分割 18 if string in [key for key in mold.keys()]: # 辞書のkeysの中にstringが含まれている場合 19 result = int(digit) - mold[string] 20 value = mold[string] 21 else: 22 value = 0 23 result = int(digit) 24 print(string, value, result)

質問内容の修正に伴い、コード修正

python

1lst = [] 2with open('list_file.txt', 'r') as c: 3 for line in c: 4 string, digit = line.split() 5 lst.append([string, int(digit)]) 6 7data = {} 8with open('data_file.txt', 'r') as f: 9 for line in f: 10 string, digit = line.split() 11 data[string] = int(digit) 12 13for l in lst: 14 string = l[0] # 可読性をよくする為だけにわざと代入しています 15 digit = l[1] # 可読性をよくする為だけにわざと代入しています 16 if string in [key for key in data.keys()]: 17 value = data[string] 18 result = digit - data[string] 19 else: 20 value = 0 21 result = digit 22 print(string, value, result, sep='\t')

投稿2020/10/01 04:43

編集2020/10/01 05:07
nto

総合スコア1438

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

これはそもそもappendを使うのが間違っているのでしょうか。

なにをしたいのか、をまずはっきりさせて、そのコードがそれを忠実に実現してるのか、を確認しましょう。
まずは、line.split()がなにを返しているのかを確認されてはどうでしょう

投稿2020/10/01 04:05

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問