2016-04-30 18 views
2

これらの2つのコードでは、2つの異なる結果が得られます。どうして?ループ上とループ後に異なる文字列の設定

len(sorted(set([w.lower() for w in text1]))) 
17231 

len(sorted([w.lower() for w in set(text1)])) 
19317 
+1

あなたは全く異なる2つのことをしているからです。 – thebjorn

+2

下位と上位の文字は同じハッシュ値を持たないので、set関数はそれらを重複とみなしません。したがって、すべての文字を小文字に変換した後、文字列から文字数を削除する可能性があります。 – Kasramvd

答えて

0
>>> text1 = 'Aa' 
>>> set(text1) # has two elements because the input has two different elements 
{'a', 'A'} 
>>> [w.lower() for w in set(text1)] 
['a', 'a'] 
>>> [w.lower() for w in text1] 
['a', 'a'] 
>>> set([w.lower() for w in text1]) # has one element because the input has two equal elements 
{'a'} 
2

文字の下部及び上部のフォームがhash value同じを持っていないので、集合関数は、重複としてそれらを想定していません。したがって、すべての文字を小文字に変換した後、set()関数は、最初のコードで文字列の文字数を削除します。あなたは文字のハッシュ値を確認するためにhash()機能を使用することができます

>>> text2 = 'ABCDEFabcdef' 
>>> 
>>> set(w.lower() for w in text2) 
set(['a', 'c', 'b', 'e', 'd', 'f']) 
>>> [w.lower() for w in set(text2)] 
['a', 'a', 'c', 'b', 'e', 'd', 'f', 'f', 'c', 'b', 'e', 'd'] 

は、次の例を考えてみ

>>> hash('A') 
8320025024 
>>> hash('a') 
12416037344 

もう少し:あなたが取得したい場合は今

より低い文字のユニークな結果は、最初のアプローチを使用するべきです。あなたはより良いリストの内包の代わりにジェネレータ式を使用するために大規模なテキストを扱っている場合でも:最初のバージョンは小文字にすべての文字列を変換し

set(w.lower() for w in text1)) 
+1

ハッシュ値について言及する必要はありません。ハッシュを使用することは実装の特徴であり、最適化です。 'hash( 'A')'と 'hash( 'a')'が等しい場合、最終的に要素が等しいかどうかをチェックするので結果は同じになります。 –

+0

@AlexHallいいえ、私はOPの結果が同じでなければならないと思います。なぜなら、明らかに両方のコードが同じである(特定の入力を変更することなく) – Kasramvd

0

、その後、種類、その後、重複を削除します。 2番目のバージョンでは、重複を削除し、小文字に変換してからソートします。

したがって、大文字と小文字が異なる入力文字列の各ペアについて、2番目のバージョンは一致する2つの(小文字の)エントリを出力します。

他にも違いはありますか?

編集:結果のリストのlen()を取得するようにコードを変更したので、詳細は表示されません。リストを比較してみてください。

関連する問題