Python:列表匹配

Python: list matching

本问题已经有最佳答案,请猛点这里访问。

我有一个列表的格式,其中包含父级的ID、ID和名称,就像级联样式。

我的输入如下:

1
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]]

我的例外输出如下

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

我试过了

1
2
3
4
5
6
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

filter删除非intsorted,用key按第一项搜索:

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

如果很难理解,则分为两行:

1
2
3
4
5
6
7
8
9
# 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])


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

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

1
out_category = sorted(category[1:])

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

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


或者,您可以在列表理解中非常容易地做到这一点:

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