2017-11-20 3 views
0

私はPython Splitを実行しようとしていますが、私のロジックに問題があるようです。要素が1つしかない場合はPython分割する

私はいくつかのデータをセミコロンで区切ります。私はそれぞれの行から一つの値を取得する20

; 50;

  • 89:ように私のデータのいくつかの例は次のようになります。例えば行1のように、私は最後の値20だけを必要とし、2番目の行から40を求めます。

    私は、次のコードを使用してみました:

    fields = fields.split(";")[-1] 
    

    それは、最初の行のために働く、私は20を得たが、私はそれが分割に一つだけの要素を持っているように、第2の行からデータを取得することができません。

    次に、以下のようなif-else条件を使用してみましたが、コードを実行できません。

    if (len(fields.split(";")) > 0): 
    
        fields = fields.split(";")[-1] 
    else: 
        pass 
    

    誰もこの問題に対処する方法を知っていますか?私が達成していることは、その行に1つの値しかない場合、私はそれを読むことになるということです。複数の値がある場合は、分割して最後の値をとります。

答えて

2

stripを使用して入力を正規化すると、1つの数値状況では;が余分にあるため、最初に削除する必要があります。だから、

In [1]: def lnum(s): 
    ...:  return s.strip(';').split(';')[-1] 
    ...: 

In [2]: lnum('89;50;20') 
Out[2]: '20' 

In [3]: lnum('89;') 
Out[3]: '89' 

In [5]: lnum('10;') 
Out[5]: '10' 
+0

'rstrip' –

2

、あなたは文字列を分割する際見れば - ['40', '']から'40;'をセミコロン(;)を使用するには、次の2つの文字列のリストを取得します。したがって、fields.split(";")[-1]は入力'40;'の空の文字列を返します。

したがって、次のように分割する前に最後のセミコロン;を除去するか、

あなたが行うことができます
print('40;'.rstrip(';').split(';')[-1]) 

OR、:

fields = '40;'.split(';') 
if fields[-1]: 
    print(fields[-1]) 
else: 
    print(fields[-2]) 

私はif/elseアプローチよりも最初のアプローチを好みます。また、.strip(), .lstrip(), .rstrip()の機能を見てください。

+0

を使用して、より良いこんにちは、私は申し訳ありませんが、私はただ一つだけの要素がある場合は、末尾にセミコロンは存在しません実現データの私の2列目のセミコロンを削除しました。 – decemberrobot

+0

@decemberrobotその後、エラーは発生していないはずです。 –

0

もう1つの方法は、reモジュールを使用することです。

from re import findall 

s1 = '80;778;20' 
s2 = '40' 

res1 = findall('\d+', s1) 
res2 = findall('\d+', s2) 

print res1[-1] 
print res2[-1] 
関連する問題