2011-01-20 11 views

答えて

39

多くの方法が考えられます。 set(重複を除外する)でそれをオンにし、1の長さを確認することができます編集:別のポスターが記載されているので、これはハッシュ可能型でのみ機能します。パフォーマンスが悪いので、私は提案を取り消しますはそれほど一般的ではありません。

ジェネレータ式all(items[0] == item for item in items)を使用すると、短絡する可能性があります(つまり、実行されずに項目の述語が失敗するとすぐにfalseを返します)。

+0

+1 map comprehensionsをmap()よりも使用することをお勧めします。 –

+0

@Artanis:それはリストの理解ではない - その理由は、 'set'ソリューションよりも優れている;) – delnan

+0

ありがとう!これはシンプルで甘いです! – derks

3
>>> l = [1, 1, 1, 1] 
>>> all(map(lambda x: x == l[0], l)) 
True 
+1

これは、whileリストを無条件に繰り返し処理することに注意してください(そうでない単純な解決策もいくつかあります)。 – delnan

+0

'map'はPython 3のイテレータなので、' all'は最初の不等値を過ぎて反復しません。あるいは、Python 2では 'functools.imap'を使います。 – PaulMcG

11
>>> a = [1, 1, 1, 1] 
>>> len(set(a)) 
1 

この方法では、リスト内の各要素をセットに配置できると想定しています。変更可能な型など、一部の型はセットに配置することはできません。

1

setをGreg Hewgillによって指摘されたものを使用することは素晴らしい解決策です。別のものがもっと怠けているので、要素の1つのペアが等しくない場合、残りは比較されません。これは、すべてのアイテムを比較するときにはsetソリューションよりも遅いかもしれませんが、ベンチマークは行いませんでした。

l = [1, 1, 1] 
all(l[i] == l[i+1] for i in range(len(l)-1)) 

特殊ケースall([]) == Trueに注意してください。

+0

これは、各項目を次の項目と比較します(また、奇数長入力の範囲外エラーを発生させます)。 – delnan

+0

@delnan:最初の要素がある場合はそれを取り、他の要素と比較する方が良いかもしれません。しかし、奇妙な長さの入力はどういう意味ですか? – AndiDog

+0

'n = len(l)'が奇数で、erlierを終了しない 'l 'は' l [n-1 + 1] = l [n] 'にアクセスしようとします。 – delnan

関連する問題