【问题标题】:Dividing a list into diagonals?将列表划分为对角线?
【发布时间】:2014-08-14 02:45:47
【问题描述】:

如果我有这个列表列表:

l = [
['a','r','v','s','s','t','n','g'],
['e','x','a','m','p','l','e','t'],
['g','z','n','p','u','t','x','m'],
['v','a','h','g','i','k','t','f']
]

如何根据对角线轻松将其划分为列表列表?

我想要的结果差不多:

[
['a'],
['r','e'],
['v','x','g',],
['s','a','z','v'],
['s','m','n','a'],

等等……

我还应该提到,我已经安装了 numpy,它在任何方面都有帮助。

【问题讨论】:

    标签: python arrays list matrix diagonal


    【解决方案1】:
    [ [ v[d-i] for i,v in enumerate(l) if d-i>=0 ] for d in xrange(len(l[0])) ]
    

    开发这是阶段:

    [ <one-diagonal-row> for <index d of each element of first row of input> ]
    
    [ [<element-of-diagonal d> for <each v, which is row i of l>] for d in xrange(len(l[0])) ]
    
    [ [ v[d-i] for i,v in enumerate(l) <only if element exists>] for d in xrange(len(l[0])) ]
    

    这会让你到达顶端。

    【讨论】:

    • 您应该努力提供解释,而不仅仅是将代码转储给 OP。
    • @Rapptz:解释的程度与 OP 所展示的努力程度相称,但我同意你的观点。
    • 由于它是代码转储,您的答案已发布在低质量队列中(这使其成为删除的候选者)。只是要记住的事情。
    • @Rapptz:但它的评分最高;有趣。
    • 另外,另一个对角线是用[ [ v[d-len(l[0])+i+1] for i,v in enumerate(l) if d-len(l[0])+i+1&gt;=0 ] for d in xrange(len(l[0])) ]得到的
    【解决方案2】:

    这是你理解的最明确的方式:

    lists = [
    ['a','r','v','s','s','t','n','g'],
    ['e','x','a','m','p','l','e','t'],
    ['g','z','n','p','u','t','x','m'],
    ['v','a','h','g','i','k','t','f']
    ]
    
    diagonals = []
    for i in range( len(lists[0])+len(lists) - 1):
        diagonal = []
    
        for lst in lists:
            if len(lst)>i and i>=0:                 
                diagonal.append(lst[i])     
            i-=1
    
        diagonals.append(diagonal)
    
    for lst in diagonals:
        print(lst)
    
    diagonals = [
    ['a'],
    ['r', 'e'],
    ['v', 'x', 'g'],
    ['s', 'a', 'z', 'v'],
    ['s', 'm', 'n', 'a'],
    ['t', 'p', 'p', 'h'],
    ['n', 'l', 'u', 'g'],
    ['g', 'e', 't', 'i'],
    ['t', 'x', 'k'],
    ['m', 't'],
    ['f']
    ]
    

    【讨论】:

      【解决方案3】:

      您可以利用每个对角线的索引总和为给定整数这一事实来实现这一点。

      给定一个列表lst,我们有:

      diagonals = [[''.join(c for j,c in enumerate(s) if i+j == n)
                    for i,s in enumerate(lst)]
                   for n in range(len(lst[0]))]
      

      或者在这个特定的例子中:

      In [15]: lst = ['arvsstng', 'examplet', 'gznputxm', 'vahgiktf']
      In [16]: [[''.join(c for j,c in enumerate(s) if i+j == n) for i,s in enumerate(lst)] for n in range(len(lst[0]))]
      Out[16]: 
      [['a', '', '', ''],
       ['r', 'e', '', ''],
       ['v', 'x', 'g', ''],
       ['s', 'a', 'z', 'v'],
       ['s', 'm', 'n', 'a'],
       ['t', 'p', 'p', 'h'],
       ['n', 'l', 'u', 'g'],
       ['g', 'e', 't', 'i']]
      

      如果您想在输出中包含不同长度的列表,您可以对其运行过滤器:

      In [18]: diagonals = [filter(None, sublst) for sublst in diagonals]
      
      In [19]: diagonals
      Out[19]: 
      [['a'],
       ['r', 'e'],
       ['v', 'x', 'g'],
       ['s', 'a', 'z', 'v'],
       ['s', 'm', 'n', 'a'],
       ['t', 'p', 'p', 'h'],
       ['n', 'l', 'u', 'g'],
       ['g', 'e', 't', 'i']]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-27
        • 1970-01-01
        • 2021-12-01
        相关资源
        最近更新 更多