2016-10-26 9 views
0

count_posは数字のリストを入力し、そのリストの正の値の量を返すことになっています。関数は私にエラーが発生します。str()> int()

def count_pos(): 
    numbers=list(input("Please enter a list of numbers separated by commas: ")) 
    count=0 
    for number in numbers: 
     if number > 0: 
      count += 1 
      add=sum(1 for number in numbers if number > 0) 
      return add 

I入力

-1、2、-5、0、3

私はエラー

Traceback (most recent call last): 
    File "so.py", line 11, in <module> 
    print (count_pos()) 
    File "so.py", line 6, in count_pos 
    if number > 0: 
TypeError: unorderable types: str() > int() 
+2

数字は文字列であり、実際には文字ですそれを整数と比較する。おそらく 'numbers = [int(x)numbers.split( '、')]'またはそれらの行に沿った何かの中のxのために。 – mgilson

+0

@mgilsonは何を言ったのですか?明らかにするために、 'numbers'を定義する前の行は' list() 'なしでなければなりません。 –

+0

編集ノート:オリジナルのテキストには** count_pos **"これは通常、呼び出しプログラムがそのリストを提供する責任を負うことを意味し、ユーザー入力を読み込むのではなく、関数*に入力パラメータが必要です。 – Prune

答えて

1

問題

与えられたあなたが投稿したコードは、実際にはPython 2.7で動作しますよう。これはのリスト(input())の機能を持たないPython 3です。

幸いにも、変数名は非常に明確です。他の人たちはすぐに問題を詳述しました - 私は特に良いと思う説明に投票しました。あなたのプログラムの設計に損傷を与えることなくのは、この問題を修正しましょう:

def count_pos(): 
user_input = input("Please enter a list of numbers seperated by commas")) 
# user_input is a raw string of the input, such as "1, 2, 3, 4" 
# break this into individual numbers: 
str_numbers = user_input.split(',') 

# str_numbers would now be ["1", " 2", " 3", " 4"] 
# These individual strings are suitable to convert to integer 
numbers = [int(str_num) for str_num in str_numbers] 

# NOW we can continue with the rest of your program, as written: 
count=0 
for number in numbers: 
    if number > 0: 
     count += 1 
     add=sum(1 for number in numbers if number > 0) 
     return add 

追加のクリーンアップすべての

まず、あなたがあなたのループの最初の正の数を見つける後に返します。 カウントは決して1より高くなりません。しかし、あなたのadd =ステートメントは実際にループが行うことに置き換わるので、正しい答えが得られます。あなたは完全にループを取り除く、あなたはそれがその仕事をすることができますので、それは最後まで実行してみましょう、ループ内でこれを実行する必要がある場合は、単に

return sum(1 for number in numbers if number > 0) 

を使用することができます。そうしてあなたは結果を返します:

for number in numbers: 
    if number > 0: 
     count += 1 

return count 

編集ノート

あなたのオリジナルテキストはcount_posは「番号のリストを取ります」と述べています。これは通常、呼び出しプログラムがそのリストを提供する責任を負うことを意味し、ユーザー入力を読み取るのではなく、関数に入力パラメーターが必要です。その場合、関数のヘッダーを修正して入力と変換を削除し、1行のソリューションのみを使用して、問題全体を解決します:

def count_pos(numbers): 
    return sum(1 for number in numbers if number > 0) 
+0

OPのコードを私がしたよりもずっと徹底的に読んで、彼が尋ねたものではなく、尋問者が望んでいたことの完全な説明を与えた。 :) –

+0

ハ!そして、私はあなたのものを投票した人になりました.POPロジックを使ってOPをうまく歩くことができました。 :-) – Prune

+0

私は見ました!しかし、あなたは、私が直面した問題を解決するのを止めてから、あなたが言ったように、私がやったよりも多くの束を捕まえました。^_ ^あなたは実際に彼のために全面的な問題を解決しました。 –

1

inputは、単一の文字列を返し得ます。

list(input(...))は、単一の文字列を含むリストを返します。

for number in numbers:は、その文字列にnumberを割り当てます。したがって、文字列になりました。

if number > 0は、numberの文字列が0より大きいかどうかをチェックしています。

そして、文字列と整数は比較できません。これに

numbers=list(input("Please enter a list of numbers seperated by commas")) 

:文字列のリストにinputから文字列を向けるだろう

numbers=map(float, list(input("Please enter a list of numbers seperated by commas").split(','))) 

は(それが分割されます

おそらく、何がやりたいことは、この行を変更していますその後、map(float, ...)はそのリストの各要素にfloat()関数を適用して、そのリストを浮動小数点のリストに変換します。あなたは

1 2 3 

を入力してくださいので、もし

1

入力はあなたの文字列と文字列を与えるためには、あなたのリストには、スペースをintに変換したり比較することはできません文字列のコレクションになります単一の文字列リテラルの集合に変換されます

[' ', '1', ' ', '2', ' ', '3'] 

とあなたのifステートメント内

この最初の比較では、あなたにエラーを与えている if ' ' > 0

ので、あなたがこの特定のエラーが出る理由は、あなたがnumber > 0を行うことを実際に

numbers=list(map(int,input("Please enter a list of numbers seperated by commas").strip().split())) 
0

整数リストにあなたの入力を変換するために、これを使用します。左側は文字列(私が説明するように)であり、右側が整数です。 Pythonでは、文字列とそのような整数を比較することはできません。

listコールは期待通りに機能しません。 input()は文字列を返し、list("A_STRING")を入力すると、各文字(["A", "_"…])のリストが表示されます。

str.split()を検索したい場合は、文字列を区切り文字で区切り、文字列のリストを返します。そして実際には、リストの各文字列を数字に変換する必要があります(たとえば、int(THE_STRING)またはfloat(THE_STRING)を使用して)。

したがって、このような何か:

text = input(…) 
elements = text.split(",") 
numbers = [int(element) for element in elements] 
関連する問題