Сортировать вложенный список: исключить первый элемент из сортировки

ЗАДАВАТЬ

у меня есть 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()

Одно из возможных решений

Что я мог сделать, так это

  1. сначала скопируйте заголовки в другой список тем или иным способом temp_list = [items_list[0]]
  2. удалять items_list[0] с использованием del items_list[0] заявление
  3. отсортировать список, используя items_list.sort(), и наконец
  4. вставить заголовки в отсортированный список 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 короче!

Другие вопросы по тегам