2016-08-26 11 views
-1

リスト項目を整理するには?私がリストl = ['a'、 'b'、 'c'、 'd'、 'e'、 'f'、 'g'、 'h'、 'i']の場合 要件はiが任意のより良いロジックが次items.Is用としてリストの項目を整理する

list l = ['a','b','c','d','e','f','g','h','i'] 
m= list() 
for i in l: 
    if (i.find("a")>=0) or (i.find("b")>=0) or (i.find("c")>=0): 
     m.append(i) 
     print m 

など別list.Current実装に、他のF、1つのリスト、D、EにC、A、Bを取得し、G、Hこの?現在の実装では、Cyclomatic Complexityは高いです。

+1

list値が減少します(ただしsetは常に0が表示されます)[投稿してください。 mcve]。引用符がない 'list l = [a、b、c、d、e、f、g、h、i]'を提供しました。入力リストはソートされていますか?出力リストも並べ替えますか?曖昧。 –

+0

引用符がないと申し訳ありません!出力リストはソートされていない可能性があります。リストlの入力を別のリストにグループ化したいだけです。 – PythonDev

+0

あなたの質問を編集することができます。 –

答えて

2

ので、あなたの例では、リスト内のfindを使用してはならない:持っているあなたは本当にインデックスを必要としないので、あなただけのlistif "a" in l

  • findあるいはinを使用することができ

    • は、線形(O(n))の複雑さなので、最適ではありません。小さなリストでは目に見えませんが、百万の要素があります。

    withは線形の複雑さを持ち、検索されたアイテムをリスト自体の代わりにループします。

    setにすると、要素はハッシュされます(また、一意でなければなりません)。より優れた検索パフォーマンスが得られます(また、パフォーマンスも挿入されますが、それは重要ではありません)。

    l= set(['a','b','c','d','e','f']) 
    m=list() 
    for i in ['a','b','z','c']: # I have introduced an extra element 
        if i in l: 
         m.append(i) 
    
    print(m) 
    

    結果:

    ['a', 'b', 'c'] 
    

    面白いです何が上記のコードはinは、すべてのコレクションオブジェクトによって共有されているので、それはsetではなくlistで動作するということです。パフォーマンスだけが異なります。 最初の行をl= ['a','b','c','d','e','f']で置き換えることはできますが、問題の例と同じように、パフォーマンスが悪くなります(もちろん、6つの項目ではありません)。

    人々がまだsetオブジェクトの能力について疑問を抱いている証拠は、アイテムがリストにあるかどうかを確認するテストです。私はlistのワーストケースを選択しましたが、別の値で行うことができます。

    import time 
    
    data=range(1000000) 
    
    start_time = time.time() 
    for i in range(1,1000): 
        999999 in data 
    
    print("list elapsed %f" % (time.time()-start_time)) 
    
    data=set(data) 
    
    start_time = time.time() 
    for i in range(1,1000): 
        999999 in data 
    
    print("set elapsed %f" % (time.time()-start_time)) 
    

    結果:

    list elapsed 17.284000 
    set elapsed 0.000000 
    

    ていなくても近い:)とあなたが検索値を減らすことができ、

  • +0

    ここで何がしますか?なぜ私はリストだけではないのですか? – PythonDev

    +0

    入力には多数の要素があります。例として6を選んだだけです。私は各要素のlの "a"の場合はできません! find/orを使うと複雑さが高いことが分かります。私はちょうどこれらを避けるための解決策が必要です! – PythonDev

    +0

    リストを入力している場合は、二分探索を使用できるように同じ要素で集合を作成する必要があります。 –

    関連する問題