Python:列表匹配

3
我已经按级联样式格式化了一个包含parent_id、id和name的列表。
我的输入如下:
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
3个回答

3
使用 filter 来删除非 int 类型,使用带有 key 参数的 sorted 方法以第一项为关键字进行搜索:
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])

1
在这种情况下,您甚至不需要键。排序将执行正确的操作并使用列表中的第一个元素。 - Roland Smith
我试图展示如何显式地按第一个键进行排序。在另一种情况下(例如按最后一个键排序),排序的行为将会有所不同,提问者将无法理解问题所在。但是,没错,第一个键将被“sorted”,而没有“key”的排序将会发生变化。 - JRazor

0

或者你可以在列表推导式中以相当易读的方式完成这个操作:

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

0

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

我错过了什么? - jDo
你复制答案的原因是什么? - JRazor
@JRazor,我没有复制任何东西。你在提到谁的答案? - jDo
什么?你的回答和我的相同,只是相差20分钟。我不明白为什么你要重复提出问题。 - JRazor
@JRazor,我添加了一个更简单的解决方案,因为我认为只要我们可以跳过列表中的第一个元素,就不需要使用lambda。由于这种方法不在您的答案中,所以您没有必要对重复投票并抱怨。 - jDo
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接