所以我尝试了一些事情然后我发现我的代码有问题。 我试图让用户选择一个列表,然后针对该列表中的项目数进行迭代。
我在这里简化了它,但你仍然可以看到问题。
list1 = [0,1,0,1,0,1]
list2 = [1,0,1,0,1,0]
a = input("Which list do you want to search for?")
for item in range(len(a)):
print(item)
这输出以下内容:
Which list do you want to search for?list1
0
1
2
3
4
>>>
您可以看到此代码不会迭代我想要的次数。 我想知道是否有人能解释为什么会这样或帮我找到解决方案?
答案 0 :(得分:2)
如果您使用的是Python3(必须是,否则代码工作正常),
list1 = [0,1,0,1,0,1]
list2 = [1,0,1,0,1,0]
a = input("Which list do you want to search for?")
print(type(a))
是一个字符串,而不是变量本身。
您可以验证它正在执行
<class 'str'>
给你
for item in range(len(vars()[a])):
print(item)
所以你可以试试这个:
0
1
2
3
4
5
产生
eval
瓦尔([对象])
使用 dict 属性返回模块,类,实例或任何其他对象的 dict 属性。 模块和实例等对象具有可更新的 dict 属性;但是,其他对象可能会对其进行写入限制 dict 属性(例如,类使用dictproxy来阻止直接字典更新)。 没有参数,vars()就像locals()一样。请注意,本地词典仅对本地人的更新有用 字典被忽略了。
作为替代方案,您可以使用for item in range(len(eval(a))):
print(item)
if
但不推荐(见official docs),因为
此功能也可用于执行任意代码
注意:有几种方法可以解决此问题。例如,正如下面所指出的,您可以通过使用{{1}}检查输入并在任一分支中对列表进行硬编码来决定使用哪个列表。此选项的问题在于它不适合更高/可变/动态数量的列表。
另一种方法可能是将列表存储在字典中并使用输入键查找它们,如另一个答案所示。这个和我的一个好处是能够处理任意数量的列表,而不仅仅是在命名空间中动态创建的几个甚至列表。
答案 1 :(得分:2)
当您将用户输入到a时,它是一个字符串。当你在你的例子中迭代它时;你正在迭代实际的字符串'list1'。
如果你想浏览列表中的项目,你需要以某种方式链接它们。
试试这个:
lists = {
'list1': [0,1,0,1,0,1],
'list2': [1,0,1,0,1,0]}
a = input("Which list do you want to search for?")
if a in lists:
for item in lists[a]:
print(item)
else:
print("Don't have that list")
注意:
for item in lists[a]
列出[a]引用列表;你现在可以用它做你想做的事;比如使用range / len ....