【问题标题】:How do I print a list of lists where the inner lists contain both strings and lists of strings?如何打印内部列表同时包含字符串和字符串列表的列表列表?
【发布时间】:2018-12-21 07:25:30
【问题描述】:

例如,

list1 = [ ['str1', 'str2', 'str3'],
          [['str4', 'str5'], 'str6', 'str7', 'str8'],
          ['str9', 'str10']]

我希望 list1 输出如下:

str1 str2 str3
str4 str5 str6 str7 str8
str9 str10

这样,属于第一层内部列表的每个内部列表都在自己的行上。

在上面的例子中,我将下面描述的部分称为第一层的内部列表:

['str1', 'str2', 'str3'] 

但是在下一节中,我会说 str4 和 str5 在属于第二层的内部列表中。换句话说,它们属于内部列表的内部列表。

[['str4', 'str5'], 'str6', 'str7', 'str8']

【问题讨论】:

  • 你换行的逻辑是什么?为什么str3str8str10后面有换行符,而str5后面没有?
  • 我想在单独的行上打印每个内部列表。
  • 另外,'str8'] 之后似乎缺少逗号。
  • 我加了逗号,谢谢。
  • 因此您应该编辑您的预期输出,使str4 str5str6 str7 str8 位于不同的行。

标签: python arrays list loops flatten


【解决方案1】:

您可以为此使用itertools.chain

list1 = [['str1', 'str2', 'str3'],
        [['str4', 'str5'], 'str6', 'str7', 'str8'],
        ['str9', 'str10']]

from itertools import chain

def listy(x):
    return x if isinstance(x, list) else [x]

for sublist in list1:
    print(' '.join(chain.from_iterable(map(listy, sublist))))

str1 str2 str3
str4 str5 str6 str7 str8
str9 str10

【讨论】:

  • 嘿 jpp,你能提供一些关于你正在使用的 itertools 库函数的时间复杂度的信息吗?
【解决方案2】:

使用递归函数处理任何深度的子列表,但在每个子列表之后打印换行符是可选的,并且仅在第一次调用时启用。

list1 = [ ['str1', 'str2', 'str3'],
        [['str4', 'str5'], 'str6', 'str7', 'str8'],
        ['str9', 'str10']]
def p(l, newline=True):
    output = ''
    for i in l:
        if isinstance(i, str):
            output += i + ' '
        else:
            p(i, False)
            if newline:
                print()
    print(output, end='')
p(list1)

这个输出:

str1 str2 str3 
str4 str5 str6 str7 str8 
str9 str10 

【讨论】:

    【解决方案3】:

    首先,您需要遍历第一个内层,然后将其中的元素展平。

    然后用join函数按顺序打印。详情如下。

    list1 = [ ['str1', 'str2', 'str3'],
            [['str4', 'str5'], 'str6', 'str7', 'str8'],
            ['str9', 'str10']]
    
    def flatten(lst):
        if lst==[]:
            return lst
        else:
            if isinstance(list[0], list):
                return flatten(lst[0])+flatten(lst[1:])
            else:
                return [lst[0],]+flatten(lst[1:])
    
    def print_it(lst_rino):
        for lst in lst_rino:
            new_lst=flatten(lst)
            print(" ".join(new_lst))
    
    print_it(list1)
    
    The Output:
    
    str1 str2 str3
    str4 str5 str6 str7 str8
    str9 str10
    

    【讨论】:

    • 我认为isinstance(list[0], list)type(lst[0])==list 干净。
    【解决方案4】:

    对python还是新手,但不能用简单的字符串连接和列表元素来解决吗?

    类似的东西

    list1 = [['str1', 'str2', 'str3'],[['str4', 'str5'], 'str6', 'str7', 'str8'],['str9', 'str10']]
    
    print(str(list1[0]) + '\n' + str(list1[1]) + '\n' + str(list1[2]))
    

    输出正是 op 要求的?

    ['str1', 'str2', 'str3']
    [['str4', 'str5'], 'str6', 'str7', 'str8']
    ['str9', 'str10']
    

    【讨论】:

    • OP 要求打印序列。所以输出应该像他/她要求的那样打印,而不是像你所做的那样的字符串表示。
    • 嗯,我试过了,还有很长的路要走,我想我应该回答问题 XD
    猜你喜欢
    • 2021-02-27
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多