如何获取嵌套列表的索引的用户输入?

时间:2017-12-04 00:35:44

标签: python python-3.x list

我试图创建它,以便用户输入嵌套列表的索引,然后删除该指定的元素。例如,用户应输入:my_list[0][3],它将删除该元素

这是我尝试过的:

def nested_remove(L, x):
    if x in L:
        L.remove(x)
    else:
        for element in L:
            if type(element) is list:
                nested_remove(element, x)
my_list=[["A",0,0,0],["B",0,0,0],["C",0,0,0],["D",0,0,0]]
x=int(input("What would you like to remove?"))
nested_remove(my_list, x)
print(my_list)

我需要它将用户输入标识为索引,而不是整数。我目前得到的错误是:

value error: invalid literal for int() with base 10: 'my_list[0][3]'

1 个答案:

答案 0 :(得分:0)

因此,从您的代码段开始,您可以使用单个列表(即不嵌套)。但是,当涉及嵌套列表时,您正面临着这个问题。这里的问题在于你的来电。从您的输出中调用时: -

value error: invalid literal for int() with base 10: 'my_list[0][3]'

我相信你传递的是my_list[0][3]。 并且您希望这将被评估,并将返回您要从列表中删除的值。因此,您希望,您将获得一个整数(作为上述评估的结果),这就是将类型转换为int的原因。

需要注意的是,评估表达式,而不是值。并且,当我们将值传递给input()时,解释器并不接受它作为表达式,因此没有评估。它只是将其存储为字符串。因此,int类型转换因上述错误而失败,因为my_list[0][3]未被评估。

所以我建议你为什么不接受2个元素的元组,其中第一个元素指定列表编号,第二个元素是第一个元素中指定的列表中元素的索引。

def nested_remove(L, x):
    def _process_input(L,x):
      x = x.split(',')
      if len(x) == 1:
        k= int(x[0])
      else:
        k = (L[int(x[0])][int(x[1])])
        L = L[int(x[0])]

      return L,k

    L,x = _process_input(L,x)
    try:
      L.remove(int(x))
    except ValueError as e:
      print ("Value not present")

   print(L)

在上面,当存在单个列表时传递元素,当存在嵌套列表时传递元组(用逗号分隔)。 _process_input()方法解析您的输入并返回要删除的值和列表。

现在使用嵌套列表运行上面的代码: -

>>> my_list=[["A",1,2,3],["B",4,5,6],["C",7,8,9],["D",10,11,12]]
>>> nested_remove(my_list, x)
What would you like to remove :-  3,1
[['A', 1, 2, 3], ['B', 4, 5, 6], ['C', 7, 8, 9], ['D', 11, 12]]

当存在单个列表时: -

>>> my_list = [34, 5, 76]
>>> nested_remove(my_list, x)
What would you like to remove :-  5
[34, 76]

希望这有帮助