排序嵌套列表:从排序

时间:2017-09-25 05:28:40

标签: python list csv sorting

SET

我有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]声明
  3. 删除del items_list[0]
  4. 使用items_list.sort()对列表进行排序,最后使用
  5. 使用index(0)
  6. 将标题插入已排序列表的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行“茶点”。

    Subquestion

    还有其他(更简单的)方法吗?

3 个答案:

答案 0 :(得分:0)

这是简单的可能解决方案,

[items_list[0]] + sorted(items_list[1:])

或使用pandas如果没有理由不使用

pandas sort

感谢juanpa.arrivillaga

解释为何使用sorted()而不是.sort()

sorted()返回排序列表,但.sort()是自己的更改列表。 (不归)

所以如果您想使用.sort(),那么代码将是

values = items_list[1:].sort()
item_list = [item_list[0]] + values

使用sorted更短!

答案 1 :(得分:0)

我能想到的最简单方法是使用pandas

使用pandas阅读csv:

df = pd.read_csv("my_refresments.csv")
df.sort_values("PRICE")

根据价格对数据进行排序,标题存储在df.columns中,因此不会对实际数据进行排序。

答案 2 :(得分:0)

干净的衬垫将是:

items_list[1:] = sorted(items_list[1:])

参考:https://stackoverflow.com/a/5827649/937153