1

ユーザーが入力した文字列が他の文字列のリストに含まれているかどうか、およびそれらの文字列の順列が「*」で区切られているかどうかを確認しようとしています。

言い換えれば、ここに私がこれまでに持っているコードがあります:

user_string=raw_input("Please supply a string")


viable_entries=['this', 'that', 'something else']

if user_string in viable_entries:
    print "here I'd move on with my script"

また、user_string = "something else*this" または "this*that" などの場合、「ここでスクリプトを続行します」と出力したいと思います。

これを行う簡単でpythonicな方法はありますか?

4

2 に答える 2

5

入力を分割して使用できますset.issubset

if set(user_string.split('*')).issubset(viable_entries):
     ...

Trueこれは、エントリが繰り返されても得られることに注意してください( "this*this")。ユーザーが繰り返しエントリを提供するのを防ぎたい場合は、次を使用できますlen(set)

entries = user_string.split('*')
if set(entries).issubset(viable_entries) and len(set(entries)) == len(entries):
     ...
于 2013-02-06T18:11:43.930 に答える
1

ecatmur のソリューションの方が優れていますが、「ブルート フォース」アプローチは、viable_entries のパワー セットを生成し、それに基づいてチェックすることです。itertoolsページから適応:

def powerset(iterable):
    "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (2,1) (3,1) (3,2) (1,2,3)..."
    s = list(iterable)
    return chain.from_iterable(permutations(s, r) for r in range(len(s)+1))

その後、"*".join(X) for X in powerset(viable_entries)照合するリストが表示されます。

于 2013-02-06T18:18:52.047 に答える