【问题标题】:Modifying nested lists修改嵌套列表
【发布时间】:2010-12-06 20:28:16
【问题描述】:

如何在 Python 中处理嵌套列表?我在弄清楚语法时遇到问题。比如:

>>> l = [[1, 2, 3], [5, 6, 7]]

我想对这个列表中的所有元素求平方。我试过了:

[m*m for m in l]

但这不起作用并抛出:

TypeError:不能将序列乘以 'list' 类型的非 int

我猜是因为嵌套列表?

我该如何解决这个问题?

【问题讨论】:

    标签: python nested-lists


    【解决方案1】:
    >>> l = [[1, 2, 3], [5, 6, 7]]
    >>> [[e*e for e in m] for m in l]
         |-nested list-|
        |----   complete list    ---|
    [[1, 4, 9], [25, 36, 49]]
    

    【讨论】:

    • 谢谢!有时会很幸运。
    • 有趣,没想到会这么简单。
    • 我知道这对你们中的一些人来说是SOTBO,但除非您指定它,否则您的结果不会被存储,如l = [[e*e for e in m] for m in l]
    【解决方案2】:

    假设您希望答案如下所示:

    [[1, 4, 9], [25, 36, 49]]
    

    你可以这样做:

    l = [[1, 2, 3], [5, 6, 7]]
    
    for x in range(len(l)):
        for y in range(len(l[x])):
            l[x][y] = l[x][y] * l[x][y]
    
    print l
    

    显然,列表理解答案更好。

    【讨论】:

      【解决方案3】:
      [[1,2,3],[4,5,6]] != [1,2,3,4,5,6]    
      
      [map(lambda x: x *x,sl) for sl in l]    #List comprhension
      

      【讨论】:

      • 我尽可能避免使用 lambda!但是+1。
      【解决方案4】:

      你需要的是一个递归函数,像这样:

      def square(el):
          if type(el) == list:
              return [square(x) for x in el]
          else:
              return el**2;
      

      我不想在这里讨论type(el) == list 的正确性,但你明白了要点。

      当然,这也可以通过列表理解来实现,因为很多人都有指针,前提是结构总是相同的。此递归函数可以处理任何级别的递归,以及包含列表和数字的列表。

      【讨论】:

      • 递归对于不同深度的树来说是无价的,但这里可能不需要。
      猜你喜欢
      • 1970-01-01
      • 2019-03-27
      • 2019-10-18
      • 1970-01-01
      • 1970-01-01
      • 2012-03-07
      • 2019-07-18
      • 1970-01-01
      • 2011-08-06
      相关资源
      最近更新 更多