【问题标题】:Error when search values in Python在 Python 中搜索值时出错
【发布时间】:2016-01-24 08:01:14
【问题描述】:

我有一个包含以下值的链表:

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

【问题讨论】:

    标签: python list sorting linked-list


    【解决方案1】:

    您已经在遍历外部列表,因此不需要两次索引查找。

    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]
    

    【讨论】:

    • 太棒了!关于您的评论的另一个问题:如果我考虑性能,其中一种情况的使用有什么不同吗?
    • 从技术上讲,filter 和列表推导已针对它们的功能进行了优化,但 99/100 倍的性能差异为零。
    【解决方案2】:

    我假设input 将成为您的列表。在这种情况下,

    for i in input:
    

    将在每次迭代期间将每个子列表作为i 提供给您。通过尝试访问

    i[0][0]
    

    您正在尝试访问子列表元素的第一个元素。在你的例子中

    • i 会给[4, 1, 2, 2]
    • i[0] 会给4,并且
    • i[0][0] 因此没有意义

    请改用i[0]

    编辑:请注意,此答案仅用于指出您当前的问题。 dursk's answer 为您尝试整体执行的任务提供了其他解决方案,并且这些选项更强大(列表理解是一个很棒的工具,我建议您研究一下)。

    【讨论】:

    • 很好地解决了这个问题!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 2017-09-20
    • 1970-01-01
    • 2022-10-17
    • 1970-01-01
    • 1970-01-01
    • 2019-12-29
    相关资源
    最近更新 更多