Python: список соответствия
У меня есть формат списка списков с 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 ответа
Использование filter
для удаления не int
а также sorted
с key
для поиска по первому элементу:
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([item for item in category if type(item[0])==int])
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])