2016-05-29 8 views
0

これは私のコードです。あなたが見ることができるように、要素がリストにない場合は、すべての要素をリストに追加しますが、まだ何らかの形で重複要素があることに気付きました。リストにないと、まだ重複している要素があります

def getExtraData(table): 
    extraData = list() 
    for ele in table: 
     extras = re.findall('\[(.+?)\]', str(ele[0])) 
     for extra in extras: 
      single = extra.split(", ") 
      for s in single: 
       if s not in extraData: 
        extraData.append(s) 
    return extraData 

pycharmデバッガーコンソールでスクリーンショットを撮って、要素が本当に同じであることを示します。

enter image description here

なぜこれが起こる可能性があり、どのように私はそれを修正することができますか?

答えて

2

どうして私はそれを修正できますか?

問題はありません。すべて問題ありません。これらの文字列がであるため、S et、ボックスsなどが得られます。異なる文字列です。あなたは大文字と小文字を区別しないようにしたい場合は、店舗小文字のバージョン、および小文字のテストも、さらに

if s.lower() not in extraData: 
    extraData.append(s.lower()) 

のように、なぜあなたは、すべてのリストを使用していますか?これは、(ほぼO(1)O(N)からinの計算の複雑さを軽減)だけセット

def getExtraData(table): 
    extraData = set() 
    for ele in table: 
     extras = re.findall('\[(.+?)\]', str(ele[0])) 
     for extra in extras: 
      single = extra.split(", ") 
      for s in single: 
       extraData.add(s.lower()) 
    return list(extraData) 

か短い偶数ビットでなければなりません代わりに

def getExtraData(table): 
    extraData = set() 
    for ele in table: 
     extras = re.findall('\[(.+?)\]', str(ele[0])) 
     for extra in extras: 
      extraData.update(map(str.lower, extra.split(", "))) 
    return list(extraData) 
1

に(わずかに速いと、私たちはPythonのループを省略して)あなたがextraDataに格納するときに文字列の大文字と小文字を保持したい場合は、チェック部分にジェネレータを使用できます。

if s.lower() not in map(str.lower, extraData): 
    extraData.append(s) 

Case insensitive 'in' - Pythonに触発されています。

あなたのケースでは、extraDatalistなので、この解決策には大きなパフォーマンス上のペナルティはありません。

+0

これは、リストの2回の反復と、メモリの再割り当てです(ジェネレータの各要素は、不変のオブジェクトとしてコピーする必要がある小文字の文字列を作成します)。もちろん、サイム大規模な複雑さ。さらに、格納されたコンテナから最初の大文字を取得するので、プロセスは順序に依存します。 – lejlot

関連する問題