0

我只是在测试列表在 python 中是如何工作的,我发现它非常令人困惑和令人沮丧。无论出于何种原因,我的代码都会不断收到错误消息。

def listtest(list1,x):
    list2 = []
    count = 0
    for n in list1:
        if list1[count] == x:
            count += 1
        else:
            list2 = list.append(list2,list[count])
            count += 1
    return list2

无论出于何种原因,它要么告诉我list.append只接受一个令人困惑的论点。在交互窗口中,我可以使用两个参数调用 append ,例如 solist.append(list,3)或其他,它可以完美地工作。我得到的另一个错误是

list2 = list.append(list2,list[count])
TypeError: 'type' object has no attribute '__getitem__'

这对我来说完全是荒谬的,而且没有任何帮助。我的代码有什么问题?为什么交互窗口的行为与其他窗口不同?为什么不像在交互窗口中那样追加工作?

4

4 回答 4

3

编辑: 经过更仔细的分析后重写:

您的直接问题list[count]应该list1[count]. 内置类型list不能被索引(因为它是一个类型,而不是一个列表),所以你会得到TypeError关于__getitem__()方法不被支持的信息。

但即使你写了list2 = list.append(list2,list1[count]),你仍然有问题。那行代码会做什么?

  1. 附加list1[count]list2. 到目前为止,一切都很好。
  2. 将调用结果分配给list.append()to list2。由于.append()是一种修改就地调用的对象的方法,因此它总是返回None.
  3. 所以现在list2None
  4. 下次您调用该 行时,您将得到另一行,TypeError因为您无法将任何内容附加到NoneType对象。

所以,你应该写的是

list2.append(list1[count])

虽然这现在可行,但这是一种非常迂回的方法。跟踪您实际上不需要的索引是非常不合 Python 的 - 该语言比这更具表现力。不要尝试用 Python 编写 Java 程序。您的功能(如果您的目标确实是创建一个新列表,其中包含与其中list1相同的所有对象x- 我完全看不到这一点)可以写成

def listtest(list1, x):
    return [item for item in list1 if item == x]

虽然这并不比简单地写作有用多少

list1.count(x)

x这给了你出现的次数list1

于 2012-12-19T18:51:23.310 回答
1

您的错误并非荒谬,他们试图将您指向根本问题。你不应该list用作变量名,因为list它是一个内置类型。此外,当您尝试访问append列表时,您确实只想传递一个参数。你可以append这样tuple

myList.append(('val1', 'val2'))
于 2012-12-19T18:52:11.777 回答
1

如果要附加到list2,请使用list2.append(),而不是list.append()

于 2012-12-19T18:52:41.553 回答
0

您一次只能附加一项来列出。您可以使用第二个列表的项目扩展()一个列表,这基本上意味着您将第二个列表的每个单独项目附加到第一个列表中。这里有什么难理解的?列表 API 有很好的文档和清晰的说明。

于 2012-12-19T18:51:14.473 回答