43629


python3.5を使っています。例えば["a","b",1,2,3]というリストがあったときに、[1,2,3]というリストに直したいです。下は、試しに書いてみたコードです。

[code]

    list1=["a","b",1,2,3]
    
    
    list_number=False
    while list_number==True:
        try:
            float(list1[0])
            list_number=True
        except:
            list1=list1[1:]
            list_number=False
    
    print(list1)
    
[/code]

これでlist1が[1,2,3]に変換されると思ったのですが、変わりませんでした。どうすればよいのでしょうか。


CC BY-SA 3.0
2018-04-26T05:03:01.177
43561
2018-04-28T05:21:32.807
26529
question
python python3
pythonでリストで最初の方に文字列があるときにその部分を削除したい

[code]

    while list_number==True
    
[/code]

を

[code]

    while list_number==False
    
[/code]

にしたら出来ました。


CC BY-SA 3.0
2018-04-26T07:05:55.410
43565
2018-04-26T07:05:55.410
26529
43561
answer


ご自身の修正ですと、要素が **全て数値以外** の場合に無限ループに陥るため、ご注意ください。

数字が出るまで先頭の要素を消すコードと、数字以外の要素を除外するコードの例を記載します。

[code]

    #数字が出るまで先頭の要素を消す
    list1 = ["a","b",1,2,3,"c",0.5]
    for v in list1:
        try:
            float(v)
            break   #数字が出てきた時点でループ終了
        except:
            list1 = list1[1:]
    
    print(list1) #数字がない場合空要素[]になる
    
    #数字以外の要素を除外する
    def is_num(s):
        try:
            float(s)
        except ValueError:
            return False
        else:
            return True
    
    list2 = ["a","b",1,2,3,"c",0.5]
    list2 = [f for f in list2 if is_num(f)]
    print(list2)
    
[/code]


CC BY-SA 3.0
2018-04-26T07:48:45.940
43568
2018-04-26T07:48:45.940
9820
43561
answer

[code]

    list1=["a","b",1,2,3]
    
[/code]

として、要件を満たす最も簡潔な方法は、下記のような記述でしょう。

[code]

    [x for x in list1 if type(x) is not str] #=>[1,2,3]
    
[/code]

各要素のうち、文字列型でないものを抽出できます。  
他の言語においてはfilterとか言われているリスト操作ですが、pythonでは上記のようにリスト内包表記にifを用いることでフィルタリングを簡単に実行できます。  
またpythonは値自体が型をもっているのでそれ(str型)を利用したほうが、floatにキャストして例外処理を行うよりも好ましいと思います。


CC BY-SA 3.0
2018-04-28T05:21:32.807
43629
2018-04-28T05:21:32.807
25980
43561
answer