2016-09-22 7 views
-1

現在、私のコードは、リスト内の各単語の位置を含むテキストファイルを作成し、以下のようなので:TypeError: - 'str'と 'int'のためのサポートされていないオペランドタイプ

file content

私のコードは、ファイルをバックアップ開き、テキストファイル内のそれらの位置や単語を使って文を再作成することができるはずですが、それはとして動作するようには思えません何らかの理由でコードを読み込みます。例えば

openfilename = open(openfilename,"r") 
readlines = openfilename.readlines() 

wordslist = readlines[0] 
positionslist = readlines[1] 

print(positionslist) 
print(wordslist) 

originalsentence = " ".join([wordslist[x-1] for x in positionslist]) 
print(originalsentence) 

これはwordslistとpositionslistのように出てくる思い付く:

私が使用していたかのように
[1, 2, 3, 2] 
['test123', ',', '.'] 

positionslist = [1, 2, 3, 2] 
wordslist = ['test123', ',', '.'] 
originalsentence = " ".join([wordslist[x-1] for x in positionslist]) 
print(originalsentence) 

それが働くだろう、と私はありません持っています理由は、なぜなら、Pythonの新人として、あなたは彼らが同じように働くと思います。同じエラーで他の人の記事を見て、私はおそらくどこかのコードの

(int(...) 

行がありませんが、私はどこか、それはさえ問題だかはわかりません。

+0

一部のStackoverflowユーザーはランダムリンクを開くことはできません。代わりに画像を貼り付ける必要があります。その場合、スクリーンショットは過度のものですが、2行しかないので、実際にはファイル内の内容を記述する方が簡単です。そのため、@ Jean-FrançoisFabreはまずあなたの質問に正しく答えることができませんでした。とにかく、私は助けになることができてうれしいです。 Stackoverflowへようこそ! –

+0

@MaxChrétienスクリーンショットについて私の悪いことは、私は将来の質問のために念頭に置いておきます。途中であなたの助けをありがとう、私はそれを感謝します。 – Mika1996

答えて

2

別の解決策は、直接intergerのリストにあなたの文字列u'[1, 2, 3, 2]を変換するast.literal_eval()を使用することです:

import ast 

with open(openfilename, "r") as f: 
    positionslist = ast.literal_eval(f.readline()) 
    wordslist = ast.literal_eval(f.readline()) 

    print(" ".join([wordslist[x-1] for x in positionslist])) 

また、with文はtryおよびcatchを交換してください。また、ブロックの後に自動的にファイルを閉じます。

+1

あなたは入力画像を実際に開いた唯一の人物です。さて、質問形式が悪いです。とにかく良い答えです。 –

+0

@ Jean-FrançoisFabreさん、スタックオーバーフローコミュニティの方に感謝しています:) –

2

EDIT:この回答は「未処理」形式とみなされます。ここでは機能しません。 "1 4 5 6 7"のような行を分割して得られた文字列のリストで既にある場合はとなります。行にはstr(list)と書かれたpythonリストが含まれているので、ここではそうではありません。その場合、ast.literal.evalが正しい選択です。の場合、入力フォーマットは満足していて、間違いではありません。

あなたは:

positionslist = readlines[1] 

あなたが整数を含む文字列のリスト以外の何かを得る方法はありません。たとえば、次のように変換する必要があります。

positionslist = [int(x) for x in readlines[1]] 

ハードコーディングされた例では、整数を直接使用しています。

注:cricket_007が示唆したように、あなただけのpositionslistに反復するので、あなたは

positionslist = map(int,readlines[1]) 

を使用することができますそれはreadlines[1]の各項目にint関数を適用するには、(反復可能を返すことはPython 2にlistを返し、そうではありませんその場合は上記のリストの理解とはかなり異なる)。

Python 3では、インデックスを使用しないので不要なリストを作成/割り当てすることはありません(1度だけ反復することはできないため、デバッグしたくない場合)。それはより効果的です。当然の

いくつかの行が数字でない場合、それは明示的なエラーでクラッシュしますValueError: invalid literal for int() with base 10

+0

または 'positionslist = map(int、readlines [1])' –

+0

ええ、ここではPython 3でも動作します。それを編集する。 –

+0

ファイアウォールのためにファイル形式が表示されませんでした。入力ファイルをテキストとして投稿する方が良いでしょう。その場合、Max Chretienが示唆するように、リストをPythonで直接解釈するには 'ast.literal_eval()'を使う必要があります。これはおそらく、Pythonと 'str(yourlist)'を使用して入力ファイルを書き、値を1つずつ書くのではないからです。 –

0

問題は、ファイルから読み込むとき、値はデフォルトでstr型である、です。そして、x-1[wordslist[x-1] for x in positionslist]にしようとすると、subtractを文字列から試してみるとエラーになります。

positionslist = readlines[1] 
positionslist = map(int, positionslist) # <-- add this line in your code 

をし、あなたのコードは動作します。この問題を解決するために、としてint型のリストにpositionslistを変換します。それについて知るにはmap()をチェックしてください。

関連する問題