问题描述
我有一个具有以下值的链表:
switch_list = [[4, 1, 2, 2],
[4, 2, 3, 2],
[3, 1, 1, 3],
[3, 2, 4, 2],
[1, 3, 3, 1],
[1, 2, 2, 1],
[2, 1, 1, 2],
[2, 2, 4, 1]]
我的目标是将一个整数与所有链接列表的第一个值进行比较,然后返回带有过滤值的新列表。
示例:我希望switch_list中的所有值的第一个数字等于4,然后该函数将返回:
[[4, 1, 2, 2], [4, 2, 3, 2],]
这是我的程序:
def bucket(value, input):
output = []
for i in input:
if i[0][0] == value:
output.append(i)
return output
这是输出错误:
File "matrix_optimizate.py", line 63, in bucket
if i[0][0] == value:
TypeError: 'int' object has no attribute '__getitem__'
1楼
我假设input
将是您的列表列表。
在这种情况下,
for i in input:
在每次迭代中都会给您每个子列表作为i
。
通过尝试访问
i[0][0]
您正在尝试访问子列表的元素的第一个元素。 在你的例子中
-
i
会给[4, 1, 2, 2]
-
i[0]
将给出4
,并且 -
i[0][0]
毫无意义
请改用i[0]
。
编辑:请注意,此答案仅用于指出您当前的问题。 为您要整体执行提供了其他解决方案,这些选项功能更强大(列表理解是一个很棒的工具,我建议您对其进行研究)。
2楼
您已经在外部列表上进行了迭代,因此不需要两次索引查找。
for i in input:
if i[0] == value:
output.append(i)
另外,还有一种使用filter
更优雅的方法:
def bucket(input, value):
return filter(lambda x: x[0] == value, input)
在这一点上,您可能甚至不需要它,因为它是自己的功能。
最后,您还可以使用列表推导:
[i for i in input if i[0] == value]