1

次のデータを含むファイルがあります。

PAIR 1MFK 1 URANIUM 82 HELIUM 112 3.6997  
PAIR 2JGH 2 PLUTONIUM 98 POTASSIUM 88 5.3003  
PAIR 345G 3 SODIUM 23 CARBON 14 1.664  
PAIR 4IG5 4 LITHIUM 82 ARGON 99 2.5506

ここで、列 5 の値が列 7 の値より大きいか、またはその逆かを調べる必要があります。私が使用した:

inp = open("filename".'r').read().strip().split('\n')
for line in map(str.split, inp):
    k = line[5]
    m = line[7]
    if k > m:
        print 'loop 1 satisfies'
    elif m > k:
         print 'loop 2 satisfies'
    else:
         print 'loop error'

しかし問題は、次のような出力が得られることです。

loop 1 satisfies  
loop 1 satisfies  
loop 1 satisfies  
loop 1 satisfies  

ただし、1 行目の 5 列目の値 82 が 7 列目の値よりも小さい場合。この種のエラーの理由がわかりません。
助けてください。

4

3 に答える 3

2

最初に数値に変換していないため、データは文字列のままです。

>>> '82' < '112'
False
>>> 82 < 112
True

ちなみに、アイテムは0からカウントを開始するので、おそらく4番目と6番目のアイテムを比較するつもりだったと思います。

于 2012-05-04T03:43:43.680 に答える
2

それはあなたが比較しているからです、それらを最初Stringsに変換してください。integers

inp = open("filename",'r').read().strip().split('\n')
for line in map(str.split, inp):
  k = int(line[4]) #lists start at index 0 not 1
  m = int(line[6])
  if k > m: print 'loop 1 satisfies'
  elif m > k: print 'loop 2 satisfies'
  else: print 'loop error'

loop 2 satisfies
loop 1 satisfies
loop 1 satisfies
loop 2 satisfies
于 2012-05-04T03:43:53.167 に答える
1

他の回答は文字列比較の問題に対処していますが、Python のcsvモジュールを使用してタスクを解決することもお勧めします。このファイルの列はスペースで区切られており、csv.readerオブジェクトを使用する方がはるかにクリーンでメモリ効率が良いです。

修正されたコードは次のようになります。

import csv

inp = csv.reader( open("filename", "r"), delimiter=' ')
for line in inp:
    k = int(line[4]) # 5th column == index 4
    m = int(line[6]) # 7th col == index 6
    if k > m:
        print 'loop 1 satisfies'
    elif m > k:
        print 'loop 2 satisfies'
    else:
        print 'loop error'

また、これにより文字列比較の問題が解決され、適切なゼロベースのインデックスが使用されることに注意してください。

于 2012-05-04T03:50:41.153 に答える