Сортировать вложенный список: исключить первый элемент из сортировки
ЗАДАВАТЬ
у меня есть csv file
который включает в себя текущий баланс моих напитков (это запятая, но в этом примере запятые ,
удаляются для улучшения читаемости):
NAME AMOUNT PRICE
Coca-Cola 8 1.25
Fanta 6 1.29
Dr. Pepper 2 2.20
Sprite 10 1.35
Guarana 6 1.80
Pepsi 4 1.25
Я читаю все данные в память (список) и делаю все необходимое редактирование, используя:
import csv
# format list for refreshments
items_list = []
with open("my_refresments.csv", newline='') as fileOpener:
open_csv = csv.reader(fileOpener)
for rows in open_csv:
items_list.append(rows)
Список items_list теперь распечатывается как:
items_list = [["NAME","AMOUNT","PRICE"],
["Coca-Cola","8","1.25"],
["Fanta","6","1.29"],
["Dr. Pepper","2","2.20"],
["Sprite","10","1.35"],
["Guarana","6","1.80"],
["Pepsi","4","1.25"]]
ВОПРОС
Что дает мне такую сортировку:
# Notice that this is sorted, but items_list[0] is at it's place
items_list = [["NAME","AMOUNT","PRICE"],
["Coca-Cola","8","1.25"],
["Fanta","6","1.29"],
["Dr. Pepper","2","2.20"],
["Sprite","10","1.35"],
["Guarana","6","1.80"],
["pepsi","4","1.25"]]
Все, кроме первого ряда items_list[0]
должен оставаться несортированным, то есть нетронутым там, где он стоит.
Сортировка списка
В общем-то a.sort()
является хорошим вариантом для вложенных списков, потому что он не сортирует все отдельные элементы внутри списков, но вместо этого сортирует списки, сравниваемые один с другим. В этом случае я не могу использовать items_list.sort()
, потому что он также будет включать заголовки в CSV-файл, который я хочу остаться там, где он уже находится: items_list[0]
, Вот что происходит при использовании items_list.sort()
:
items_list.sort()
[['Coca-Cola', '8', '1.25'],
['Fanta', '6', '1.29'],
['Dr. Pepper', '2', '2.20'],
['Sprite', '10', '1.35'],
['Guarana', '6', '1.80'],
['NAME', 'AMOUNT', 'PRICE'],
['Pepsi', '4', '1.25']]
Странно, если я напишу все напитки с lower case
, это будет работать, потому что TEXT > text
Но я не хочу этого делать. Я хотел бы использовать slice
исключить первый ряд (заголовки), но это, кажется, не имеет никакого эффекта (или, возможно, я делаю это неправильно):
# This doesn't do anything
items_list[1:].sort()
Одно из возможных решений
Что я мог сделать, так это
- сначала скопируйте заголовки в другой список тем или иным способом
temp_list = [items_list[0]]
- удалять
items_list[0]
с использованиемdel items_list[0]
заявление - отсортировать список, используя
items_list.sort()
, и наконец - вставить заголовки в отсортированный список
index(0)
сitems_list.insert(0, temp_list)
как это:
def sort_csv_list_exclude_headers(file_name):
items_list = []
with open(file_name, newline='') as fileOpener:
open_csv = csv.reader(fileOpener)
for rows in open_csv:
items_list.append(rows)
temp_list = [items_list[0]]
del items_list[0]
items_list.sort()
items_list.insert(0, temp_list[0])
with open(file_name, "w") as fileWriter:
write_csv = csv.writer(fileWriter, lineterminator='\n')
write_csv.writerows(items_list)
sort_csv_list_exclude_headers("SODA_BALANCE.csv")
На самом деле это довольно хорошо и просто в целом при использовании csv с> 1 000 000 строк "освежающих напитков".
подвопрос
Есть ли другой (более простой) метод?
3 ответа
Чистый лайнер будет:
items_list[1:] = sorted(items_list[1:])
См. /questions/14200695/kak-ya-mogu-otsortirovat-chast-spiska-na-meste/14200701#14200701
Самый простой способ, который я могу придумать, это использовать pandas
,
Прочитайте CSV, используя панд:
df = pd.read_csv("my_refresments.csv")
df.sort_values("PRICE")
который сортирует данные по цене, а заголовок хранится в df.columns
, поэтому он не отсортирован с фактическими данными.
Это простое возможное решение,
[items_list[0]] + sorted(items_list[1:])
или использовать pandas
Если нет причин не использовать
благодаря juanpa.arrivillaga
Чтобы объяснить, почему использовать sorted()
не .sort()
sorted()
вернуть отсортированный список, но .sort()
это список изменений сам. (не возвращается)
так что если вы хотите использовать .sort()
тогда код будет
values = items_list[1:].sort()
item_list = [item_list[0]] + values
с помощью sorted
короче!