2016-08-11 10 views
0

私は本当にPythonには新しく、今はエラーが発生していて、なぜこのエラーが出るのかわかりません。ラムダと英数字のPythonエラー

私は言葉で3つのリストを持っています。リストには、数字、リテラルワード、および英数字ワードが含まれています。これらのリストはtxtファイルに保存されます。各ファイルには、他のリストや新しい単語の単語を含めることができます。

私はこれらのリストを比較し、すべての単語を重複しないで新しいリストにコピーするのが好きです。だから私はすべての単語を含む重複はありませんが、1つの大きなリストがあります。

これは私のスクリプトです:

file_a = raw_input("File 1?: ") 
file_b = raw_input("File 2?: ") 
file_c = raw_input("File_3?: ") 
file_new = raw_input("Neue Datei: ") 

def compare_files(): 

    with open(file_a, 'r') as a: 
     with open(file_b, 'r') as b: 
      with open(file_c, 'r') as c: 
       with open(file_new, 'w') as new: 
        difference = set(a).symmetric_difference(b).symmetric_difference(c) 
        difference.discard('\n') 
        sortiert = sorted(difference, key=lambda item: (int(item.partition(' ')[0]) 
                    if item[0].isdigit() else float('inf'), item)) 

        for line in sortiert: 
         new.write(line) 

k = compare_files() 

私はスクリプトを実行すると、私は次のようなエラーメッセージが出ます:私のスクリプトで何が間違っている

Traceback (most recent call last): 
    File "TestProject1.py", line 19, in <module> 
    k = compare_files() 
    File "TestProject1.py", line 13, in compare_files 
    sortiert = sorted(difference, key=lambda item: (int(item.partition(' ')[0]) 
    File "TestProject1.py", line 14, in <lambda> 
    if item[0].isdigit() else float('inf'), item)) 
ValueError: invalid literal for int() with base 10: '12234thl\n' 

は誰でもアイデアや何かを?

はあなたの助け:)

+2

「12234thl \ n」が何番になると思いますか? –

+0

達成しようとしているソート順は何ですか? –

+0

英数字の文字列を整数に変換しようとしているだけです。 – Anonymous

答えて

0

' 'partitionかすぐに数字を次の文字を知っている以外の文字列の数字の部分を抽出しませんそのことについては、他の文字列をありがとう。非常にありそうもない。

かわりに、文字列の先頭の数字部分を抽出する正規表現を使用することができ

import re 

p = re.compile(r'^\d+') 

def compare_files(): 

    with open(file_a, 'r') as a, open(file_b, 'r') as b, \ 
     open(file_c, 'r') as c, open(file_new, 'w') as new: 
     difference = set(a).symmetric_difference(b).symmetric_difference(c) 
     difference.discard('\n') 
     sortiert = sorted(difference, 
          key=lambda item: (int(p.match(item).group(0)) \ 
              if item[0].isdigit() \ 
              else float('inf'), item)) 

     for line in sortiert: 
      new.write(line) 

パターン'^\d+'文字列として符号を返しp.match(item).group(0)、文字列の先頭から全ての番号にマッチしなければなりません次にを整数にキャストします。

+0

私はあなたの変更を実装し、今は完全に動作しています。ありがとうございました :) – meGnom