Chapter43:タイプ別合計Sum by Type: isinstance関数
どうもどうもこんばんは。
しばらく体調を崩しまくっておりました、しーなです。
本日も若干ゾンビです。
しかし、週末だからね!
ちょっと落ち切ってたメンタルも若干もどってきたよっ☆
Checkio 43:S Scientific Expedition Sum by Type
問題:リストがあります。2つの値を返してください。
最初の値は、指定されたリストのすべての文字列の連結です。
2 番目の値は、指定されたリストのすべての整数の合計です。。
list(sum_by_types([])) == ["", 0]
list(sum_by_types([1, 2, 3])) == ["", 6]
list(sum_by_types(["1", 2, 3])) == ["1", 5]
list(sum_by_types(["1", "2", 3])) == ["12", 3]
list(sum_by_types(["1", "2", "3"])) == ["123", 0]
list(sum_by_types(["size", 12, "in", 45, 0])) == ["sizein", 57]
うーん、もらったリストの中の
1.文字型は結合する
2.数字は合計する
それぞれ、1と2を返せばいいの??
解き方
- もらったリストから値を取り出して、str型だったら結合、int型なら合計する?
- 識別関数は何がいいかな? type()関数?
- いやそもそも、total+=って計算させたら全部足せちゃう?
とりあえず、そのあたりでやってみよう 最初の答え
def sum_by_types(array): data="" total=0 for i in array: total+=int(i) if type(i)==int else data += i print(total,data) return(total,data) #total+=i if type(i)==int else data += i # SyntaxError: invalid syntax
こんな感じはどうでしょうか!
あれー、1行でelseが書けるかなと思ったけど、ダメなんですか。。
エラーがでちゃった。。
そういえば以前もこれでダメだったんでしたね。 何がいけないのかな・・?
def sum_by_types(array): data="" total=0 for i in array: if type(i)==int: total+=int(i) else:data += i print(data,total) return(data,total)
せっかくコンパクトに書こうと思っていたのに、これが最終解になりました。
さて、ところで素敵解はどうなの?
def sum_by_types(array): result=["",0] for item in array: result[isinstance(item,int)]+= item return result
isinstance関数・・・
また見たことのない関数が出てきましたね。。。
isinstance関数 : 1番目の引数に指定したオブジェクトが、2番目の引数に指定したデータ型と等しいかどうかを返す
えーと、なるほど??
print(isinstance(100, int)) >> True print(isinstance(100, str)) >> False print(isinstance("cat", str)) >> True print(isinstance("cat", int)) >> False
type()は型を返してくれるけど、 isinstanceはTrueかFalseかを返してくれるのか。 すごいねー、いろんな関数がほんとあるんだねぇ。。。
result=["",0]
この書き方が見慣れなかったけど、単に空の配列ってこと?
かと思ったけど・・・・・・まってくれ。
result[isinstance(item,int)]+= item
これってどういうことだ・・・・???
まったく意味わからん。
しかたがないので、例をちょっと出力してみた
array=[1, 2, 3] array=["1", "2", 3] def sum_by_types(array): result=["",0] for item in array: result[isinstance(item,int)]+= item print(result) return result #['', 1] #['', 3] #['', 6] #--- #['1', 0] #['12', 0] #['12', 3]
True(int型)だった時だけ、右側に+されてて・・・
False(str型)の時には、左側に+される・・。
まさにやりたかったことだけども・・・・。
仕組みが全然わからなかった。
strだったら、Falseがはいるんじゃないのかーい!(੭ ᐕ))?
すごいことしかわからない。。。
そういえばChapter42でも
gd[key]=gd.setdefault(key,0)+value
この表現が理解できないんだった。。似たような表現だよね?
もっと修行が必要なようだ・・・@@;
それにしても、もう少し身近で参考になるような解はないものか。。。 すごすぎると、意味がわかんないぞっ☆