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 的解决方案更好,但“蛮力”方法是生成一组可行的条目并在此基础上进行检查。改编自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 回答