我正在编写一个小游戏,只需要一个用户输入字符串的东西,它应该检查这个单词是否来自给出的字母,然后它应该附加到一个新列表。
user_input = raw_input("Please enter a word: ")
ls = ["a", "f" , "x" , "u"]
user_list = []
for i in user_input:
if i in ls:
user_list.append(user_input)
但问题是如果任何字符串匹配,整个单词都会附加到列表中。与fun
一样,aim
会附加到列表中。
答案 0 :(得分:1)
我会使用set
。您允许的字母可以是一个集合,然后从用户的单词中进行设置。如果用户指定的集合是字母表集合的子集,那么您将知道该单词仅由所需字母表中的字符组成。
user_input = raw_input("Please enter a word: ")
ls = set('afxu')
user_list = []
if set(user_input).issubset(ls):
user_list.append(user_input)
答案 1 :(得分:0)
您应该使用布尔值,只有在输入中的所有字母都在您的字典中时才添加:
user_input = raw_input("Please enter a word: ")
ls = ["a", "f" , "x" , "u"]
user_list = []
inDict = True
for i in user_input:
if not(i in ls):
inDict = False
break
if(inDict):
user_list.append(user_input)
答案 2 :(得分:0)
使用集合的条件的另一个答案是
user_input = raw_input("Please enter a word: ")
ls = ["a", "f" , "x" , "u"]
user_list = []
if set(list(user_input)).issubset(set(ls)):
user_list.append(user_input)
答案 3 :(得分:0)
您需要检查user_input
中的每个字母是否在您允许的字母列表中(您应该将其重命名为letter_list
或其他内容,因为ls
是IPython中的保留字)。
执行此操作的一种方法是将reduce
与lambda
函数一起使用:
if reduce(lambda a, b: a and b, [letter in ls for letter in user_input]):
user_list.append(user_input)
答案 4 :(得分:0)
您可以查看user_input
中的ls
中的字符all是否if all(char in ls for char in user_input)
i in ls
user_list = [user_input for i in user_input if all(char in ls for char in user_input)]
将评估为True或False,如果我们点击不在ls中的char,则循环将短路并返回False,如果user_input中的所有chars都在ls中它将返回True并且该单词将是追加。
创建单个单词列表并附加没有多大意义,但如果你真的想要它,你可以使用列表comp:
user_list = [word for word in user_input.split() if all(char in ls for char in word)]
如果您实际上想要多个单词,那么您可以拆分并检查每个单词:
ls
使用您自己的代码,您必须先检查每个字符,并且只检查每个字符后添加,但使用all是一个更好的方法。
对于大输入ls = {"a", "f" , "x" , "u"}
,集合#!/bin/bash
for r in 1 2; do
ls -lAR / 2> /dev/null | grep '^d' > run${r}.txt 1> out${r}.txt
done
diff -Nura out1.txt out2.txt
rm -f out1.txt out2.txt
将是一种更有效的方法,因为集合查找为0(1)但对于小输入大小,它不会产生任何实际差异