如何将列表作为用户输入,然后使用输入进行迭代。 - Python 3.4

时间:2015-12-10 21:35:41

标签: python list python-3.x

所以我尝试了一些事情然后我发现我的代码有问题。 我试图让用户选择一个列表,然后针对该列表中的项目数进行迭代。

我在这里简化了它,但你仍然可以看到问题。

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
>>> 

您可以看到此代码不会迭代我想要的次数。 我想知道是否有人能解释为什么会这样或帮我找到解决方案?

2 个答案:

答案 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

来自official docs

  

瓦尔([对象])

     

使用 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 ....