Python 将列表名和项目传递给函数以搜索列表。ValueError:未找到子字符串

Python 将列表名和项目传递给函数以搜索列表。ValueError:未找到子字符串,python,search,substring,Python,Search,Substring,我对Python相当陌生,但对编程没问题(尽管大约5年没有做过任何编程) 我已经搜索过了,但找不到任何答案: 我有许多列表,每个列表中都有值,我正在尝试创建一个通用函数,该函数使用两个值搜索列表,这两个值显然是列表名,以及要在该列表中搜索的字符串: list0 = ["name","date","cat","dog"] list1 = ["house","chair","table"] list2 = ["tv","dvd","computer","mouse"] usersearchlist

我对Python相当陌生,但对编程没问题(尽管大约5年没有做过任何编程)

我已经搜索过了,但找不到任何答案:

我有许多列表,每个列表中都有值,我正在尝试创建一个通用函数,该函数使用两个值搜索列表,这两个值显然是列表名,以及要在该列表中搜索的字符串:

list0 = ["name","date","cat","dog"]
list1 = ["house","chair","table"]
list2 = ["tv","dvd","computer","mouse"]

usersearchlist = raw_input("Enter list name: ")
usersearchitem = raw_input("Enter item to search for: ")

def searchmemory(usersearchlist,usersearchitem):
  return usersearchlist.index(usersearchitem)
然后调用函数:

print "I found", searchmemory(usersearchlist,usersearchitem)
我得到的是“ValueError:substring not found”,因为函数调用使用传递到函数中的文本字符串,而不是引用其中包含的值

希望这是有道理的,我是不是做错了什么?

试试看

lists = {"list0" : ["name","date","cat","dog"],
    "list1" : ["house","chair","table"],
    "list2" : ["tv","dvd","computer","mouse"]}

usersearchlist = raw_input("Enter list name: ")
usersearchitem = raw_input("Enter item to search for: ")

def searchmemory(usersearchlist, usersearchitem):
    if (usersearchlist in lists and usersearchitem in lists[usersearchlist]):
        return lists[usersearchlist].index(usersearchitem)
    else:
        return -1

这会将所有列表存储在一个字典中,并首先检查值是否存在,这样就不会出现ValueError

我更愿意将列表放在一个类似于@SimplyKiwi的答案的字典中


或者,您也可以通过以下方式实现:


请注意,在本例中,您隐式地授予用户访问所有全局变量的权限。在大多数情况下,这不是您希望用户能够做到的

python的方法是请求原谅而不是允许——而不是事先检查列表中是否有项目,
try
it,然后,
除了
如果有错误,可能会出现异常。@Lattyware,在这种情况下是
KeyError
Indexer
注意,具有名为
list1
list2
等变量。。。这是一个巨大的危险信号——无论你在哪里遇到这样的情况,你都应该使用数据结构而不是变量。这只是我的例子,别担心,它们有专有名称,只是让你们不必解码我的实际列表名就可以更简单地了解发生了什么!我的观点不是名称错误,而是代码中没有表示的那些项目的逻辑分组。如果您发现自己需要在代码中按名称获取变量,您应该使用数据结构而不是平面变量。虽然这是事实,但我不能强调这是一个多么糟糕的想法。@Lattyware我同意您的意见--请注意,我说过我更喜欢其他解决方案。我可能应该更加强调我的解决方案的潜在危害性。我马上就可以做到:)
print "I found", searchmemory(globals().get(usersearchlist, []), usersearchitem)