【问题标题】:Python: list matching [duplicate]Python:列表匹配[重复]
【发布时间】:2016-08-31 13:24:51
【问题描述】:

我已经格式化了一个包含 parent_id、id 和名称的列表列表,如级联样式。

我的输入如下:

category = [['id','name','parent_id'],[1, 'Root', 0],[10, 'Beans', 4],[2, 'Sub Root', 1],[3, 'Fruits', 2],[4, 'Veg', 2],[5, 'Apple', 3],[6, 'Onion', 4]]

我的异常输出如下

out_category = [[1, 'Root', 0],[2, 'Sub Root', 1],[3, 'Fruits', 2],[4, 'Veg', 2],[5, 'Apple', 3],[6, 'Onion', 4],[10, 'Beans', 4]]

我试过了

out_category = []
for item in category[1:]:
    print item[0].split(',')
    categ = item[0].split(',')
    out_category.append(filter(lambda x: x[0]==categ[2],categ))
print out_category

【问题讨论】:

    标签: python list cascade


    【解决方案1】:

    使用filter 删除非intsortedkey 按第一项搜索:

    sorted(filter(lambda x: isinstance(x[0], int), category), key=lambda x: x[0])
    

    如果难以理解,分两行如下:

    # Remove titles (first element of category)
    without_first_string_list = filter(lambda x: isinstance(x[0], int), category)
    
    # Or you can use if this list always have only one list with titles,
    #                          but if not, the sorting may be incorrect
    without_first_string_list = category[1:]
    
    # Sort by first item
    sorted_list = sorted(without_first_string_list, key=lambda x: x[0])
    

    【讨论】:

    • 在这种情况下,您甚至不需要密钥。排序将做正确的事情并使用列表中的第一个元素。
    • 我试图展示如何对第一个键进行显式排序。在另一种情况下(例如,按最后一个键排序)排序会表现不同,提问者不会理解问题所在。但是,是的,你是对的,第一个键将是 sorted 并且没有 key 进行排序
    【解决方案2】:

    或者,您可以在列表理解中以非常易读的方式执行此操作:

    sorted([item for item in category if type(item[0])==int])
    

    【讨论】:

      【解决方案3】:

      category 看起来像 csv 模块的输出。如果是这种情况,您可以在解析标题时跳过标题,方法是在读取文件的其余部分之前读取并丢弃第一行。

      无论如何,如果要排除输出中的第一个列表,然后根据每个嵌套列表中的第一个元素进行排序,最简单的解决方案是这样的:

      out_category = sorted(category[1:])
      

      如果您想按任何列表索引(x[0]x[1]x[2])进行排序,您可以使用sorted 并将lambda 作为key 传递:

      out_category = sorted(category[1:], key=lambda x : x[0]) 
      

      【讨论】:

      • 我错过了什么?
      • 你有什么理由重复一个答案吗?
      • @JRazor 我没有复制任何东西。你指的是谁的答案?
      • @JRazor 啊,你答案的最后一行几乎是一样的。刚刚看到你用filterisinstance等,觉得没必要。无论如何,如果你用它来“对抗竞争”,你就是在滥用投票系统;它应该用于判断内容。
      • 什么?你的回答在 20 分钟内重复我的不同。我不明白你为什么要重复提问
      猜你喜欢
      • 2014-11-22
      • 1970-01-01
      • 2023-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多