【问题标题】:How to convert a nested list of strings to a one list? [duplicate]如何将嵌套的字符串列表转换为一个列表? [复制]
【发布时间】:2021-10-28 12:15:42
【问题描述】:

我想将嵌套的字符串列表转换为单个列表。 例如, 如果有类似的列表,

fruits = ['apple','orange, ['pineapple','grapes']]

我想把它转换成:

fruits = ['apple','orange','pineapple','grapes']

我尝试使用more_itertools.chain.from_iterable(fruits),但我得到的输出是:

['a','p','p','l','e','o','r','a','n','g','e','pineapple','grapes']

即使尝试了[inner for item in fruits for inner in item],这也给出了与上面相同的输出。

我也尝试了[inner for item in fruits for inner in ast.literal_eval(item)],但这给出了错误ValueError: malformed string

有解决方法吗? 提前致谢。

【问题讨论】:

    标签: python pandas list dataframe more-itertools


    【解决方案1】:

    这里的每个人都已经给出了一些很好的答案,但最pythonic的方法是使用正则表达式。 我们可以删除方括号或仅提取字母

    import re
    fruits = ['apple','orange', ['pineapple','grapes'],['Mango',"Guava","banana"],'Fruits']
    fruits = str(fruits)
    pattern1 = "[A-Za-z]+"
    res1 = re.findall(pattern1,fruits)
    print(res1)
    

    Python 3.9.4 输出:

    ['apple', 'orange', 'pineapple', 'grapes', 'Mango', 'Guava', 'banana', 'Fruits']
    

    【讨论】:

      【解决方案2】:

      您可以使用任意优雅的方法和库,但老实说,经典的递归用例:

      def to_list_of_strings(thing):
        if type(thing) is str:
          return [thing]
        # it's not just a string, so take apart
        retlist = []
        for element in thing:
          retlist += to_list_of_strings(element)
        return retlist
      

      请注意,这适用于任意深度嵌套的列表,例如

      [[ 
        "a",
       [ 
         "more",
         [ 
           "than"
         ],
         "just",
         [
           [
             "a",
             "single",
             [
               "layer"
             ]
           ],
           "deep"
         ],
         "list"
        ]
      ]]
      

      很多其他答案都没有。

      顺便说一下,这是一种深度优先搜索算法。

      【讨论】:

      • 非常感谢。它正在工作。
      【解决方案3】:

      您正在寻找的是来自同一个包的collapse 方法。

      这是一个示例用法:

      import more_itertools
      
      fruits = ['apple','orange', ['pineapple','grapes']]
      print(list(more_itertools.collapse(fruits, base_type=str)))
      # ['apple', 'orange', 'pineapple', 'grapes']
      

      【讨论】:

        【解决方案4】:

        如果您使用more_itertools 模块,请尝试collapse 函数:

        print(list(more_itertools.collapse(fruits)))
        

        输出:

        ['apple', 'orange', 'pineapple', 'grapes']
        

        【讨论】:

          【解决方案5】:

          试试:

          fruits = ["apple", "orange", ["pineapple", "grapes"]]
          fruits = [l for v in fruits for l in (v if isinstance(v, list) else [v])]
          print(fruits)
          

          打印:

          ['apple', 'orange', 'pineapple', 'grapes']
          

          【讨论】:

            【解决方案6】:

            见下文(假设 fruits 仅包含字符串或列表)

            fruits = ['apple', 'orange', ['pineapple', 'grapes']]
            flat = []
            for f in fruits:
                if isinstance(f, str):
                    flat.append(f)
                else:
                    flat.extend(f)
            print(flat)
            

            输出

            ['apple', 'orange', 'pineapple', 'grapes']
            

            【讨论】:

            • 这也有效。谢谢你。赞成
            • 请注意,它仅在嵌套深度最多为一层时才有效。
            • 是的。我同意这一点。
            猜你喜欢
            • 2021-05-01
            • 2016-02-08
            • 2021-11-25
            • 1970-01-01
            • 1970-01-01
            • 2019-04-24
            • 1970-01-01
            • 2015-04-03
            • 1970-01-01
            相关资源
            最近更新 更多