しーなのたらたらプログラミング学習日記

よれたOLの、びみょーなプログラム学習日記です

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

この表現が理解できないんだった。。似たような表現だよね?
もっと修行が必要なようだ・・・@@;

それにしても、もう少し身近で参考になるような解はないものか。。。 すごすぎると、意味がわかんないぞっ☆