【问题标题】:How to print nested lists using nested loops?如何使用嵌套循环打印嵌套列表?
【发布时间】:2017-09-22 13:36:19
【问题描述】:

您好,我有一个关于我的问题的简化示例。

我想得到 ​​p> 的输出

1
a
b
2
c
3
d
e
f
4
g
5
h

我尝试了不同的变化,但可以弄清楚逻辑。我的代码如下。提前感谢您的帮助。我试图在不使用 numpy 或 panda 的情况下做到这一点。我正在使用python3.4

num = ["1" , "2" ,"3" , "4" , "5" ]
let = [["a","b"],["c"],["d","e","f"],["g"],["h"]]


for x in num :
    print(x)
    for y in let :
        print(y)

zipBoth = zip(num,let)


for x,y in zipBoth :
    print(x)
    print(y)

【问题讨论】:

    标签: python list for-loop nested-loops nested-lists


    【解决方案1】:

    请注意,您正在尝试打印两个列表的内容。这是时间上的线性运算。两个循环不会削减它 - 这是时间复杂度的二次方。此外,您的第二个解决方案不会使y 变平。


    使用yieldyield from 定义一个辅助函数。

    def foo(l1, l2):
        for x, y in zip(l1, l2):
            yield x
            yield from y        
    
    for i in foo(num, let):
         print(i)
    
    1
    a
    b
    2
    c
    3
    d
    e
    f
    4
    g
    5
    h
    

    如果您想要一个列表,只需调用 foo 并在其周围加上 list 包装器:

    print(list(foo(num, let)))
    ['1', 'a', 'b', '2', 'c', '3', 'd', 'e', 'f', '4', 'g', '5', 'h']
    

    请注意,yield from 从 python3.3 开始可以使用。

    【讨论】:

    • 感谢coldspeed 我研究了yield的使用。
    【解决方案2】:

    只需zip 列表并应用itertools.chain 展平两次

    num = ["1" , "2" ,"3" , "4" , "5" ]
    let = [["a","b"],["c"],["d","e","f"],["g"],["h"]]
    
    import itertools
    
    result = list(itertools.chain.from_iterable(itertools.chain.from_iterable(zip(num,let))))
    

    现在result 产生:

    ['1', 'a', 'b', '2', 'c', '3', 'd', 'e', 'f', '4', 'g', '5', 'h']
    

    你可以用它来打印:

    print(*result,sep="\n")
    

    【讨论】:

    • 这样看起来不那么难看:flatten = itertools.chain.from_iterable,然后调用flatten两次。
    • 我是在讽刺 :) 说我不明白为什么 question 被否决了......这还不错。
    • 感谢 fabre 我会研究 itertools。我还没有使用它。
    【解决方案3】:
    numlet = [c for n, l in zip(num,let) for c in [n] + l]
    for c in numlet:
        print(c)
    

    【讨论】:

      【解决方案4】:

      使用pydash 扁平化列表letpydash 是一个实用程序库。

      打印串联列表中的每个元素 (num + pydash.flatten(let))

      >>> import pydash as pyd
      >>> num = ["1" , "2" ,"3" , "4" , "5" ]
      >>> let = [["a","b"],["c"],["d","e","f"],["g"],["h"]]
      >>> for i in [str(j) for j in num + pyd.flatten(let)]:
      ...     print(i)
      1
      2
      3
      4
      5
      a
      b
      c
      d
      e
      f
      g
      h
      >>> 
      

      【讨论】:

      • 缺乏解释增加了您的答案的神秘感(以及随之而来的无益)。
      • 更新了解释。我正在使用pydash 实用程序库来展平let 中的元素
      【解决方案5】:

      此解决方案假定“num”和“let”具有相同数量的元素

      num = ["1" , "2" ,"3" , "4" , "5" ]
      let = [["a","b"],["c"],["d","e","f"],["g"],["h"]]
      
      for i in range(len(num)):
          print num[i]
          print '\n'.join(let[i])
      

      【讨论】:

        猜你喜欢
        • 2018-01-06
        • 2023-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-16
        • 1970-01-01
        相关资源
        最近更新 更多