1

リストを検証する関数を作成しようとしています。

基本的に、リスト内の特定の要素については、その前のアイテムまたは後ろのアイテムのいずれかが同じである必要があります。

適切なリストは次のように定義されます。

good_list = ["H", "H", "H", "M", "M", "L", "L", "M", "M", "H", "H", "H"]

不良リストは次のように定義されます。

bad_list = ["H", "M", "H", "M", "M", "L", "L", "M", "M", "H", "H", "H"]

私はさまざまな解決策を試し(そしてstackoverflowを読んで)数日を費やしました、そして以下は私が現在持っているものです、しかしそれは正しい答えを返していません。フィードバックに基づいて(ありがとう!)、それを更新し、引数の名前をリストからシーズンに変更して、ORにしました。それでも、「有効なリスト」が返されるべきではないのに、それはまだ返されますか?

bad_list = ["H", "M", "H", "M", "M", "L", "L", "M", "M", "H", "H", "H"]

def check_list(season):     
   for i, a in enumerate(season):
        if season[i] == season[i-1] or season[i] == season[i+1]:
            return True
   return False

result = check_list(bad_list)

if result == True:
    print "Valid list"
else:
    print "Invalid list"
4

3 に答える 3

4

私は単に使用しますitertools.groupby

if all(len(tuple(group)) > 1 for key, group in itertools.groupby(the_list)):
    print "valid"
else:
    print "invalid"

基本的に、「各要素はその直前または直後に等しい要素を持つ必要があります」という要求は、「リストは最小長2の連続する要素のグループで構成されている必要があります」と同等です。このgroupby関数はこれらのグループを作成し、allそれらの長さが。よりも大きいことを確認する必要があります1

于 2013-02-13T20:07:48.937 に答える
1

orand の代わりに使用するコードを修正するには:

if list[i] == list[i-1] or list[i] == list[i+1]:

i-1また、これらのチェックは、インデックスと それぞれi+1がリストから「落ちない」場合にのみ実行する必要があります。

これは最高のパフォーマンスを発揮するソリューションではありませんが、機能するはずです。

私はあなたのコードを自分で考え出すことになっていると思うので、修正しません。

于 2013-02-13T20:05:16.447 に答える
1

「前の要素と後ろの要素を比較する」というより一般的なケースでは、and を使用itertools.teeitertools.izipます。おそらく、次のパターンをユーティリティ関数にまとめます。

また、ループ内のロジックはインサイドアウトです。

# (inside the function)
_behind, _current, _ahead = itertools.tee(the_list, 3)
# should error check as well
_current.next()
_ahead.next()
_ahead.next()
for behind, current, ahead in itertools.izip(_behind, _current, _ahead):
    # fixing logic here
    if behind != current and current != ahead:
        return False
return True

また

return not any(behind != current and current != ahead for behind, current, ahead in itertools.izip(_behind, _current, _ahead))

長さ 1 および長さ 2 のリストは特殊なケースで処理する必要があることに注意してください。

于 2013-02-13T20:46:25.183 に答える