【问题标题】:Sort nested list: Exclude first item from sorting [duplicate]排序嵌套列表:从排序中排除第一项[重复]
【发布时间】:2018-03-06 00:08:37
【问题描述】:

设置

我有一个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. 使用del items_list[0] 语句删除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")

实际上,当使用具有 > 1 000 000 行“刷新”的 csv 时,这通常非常好且简单。

子问题

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

【问题讨论】:

  • .sort 方法有效,因此items_list[1:].sort() 会创建一个新列表items_list[1:],然后您对该新列表进行排序,但该方法返回None,并且您永远不会捕获结果,因此列表立即被丢弃。使用sorted,它返回一个新列表

标签: python list csv sorting


【解决方案1】:

这是一个简单可行的解决方案,

[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 更短!

【讨论】:

  • 你应该解释一下为什么 .sort不起作用
  • .sort 运行良好,但 sorted() 返回排序列表,但 .sort 没有
  • @juanpa.arrivillaga 我认为这是个好评论!
  • 是的,点击edit将您的解释添加到问题中
  • pandas 在我的应用中有什么好处?
【解决方案2】:

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

使用 pandas 读取 csv:

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

按照价格对数据进行排序,表头存放在df.columns,所以不与实际数据排序。

【讨论】:

    【解决方案3】:

    一个干净的衬里将是:

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

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

    【讨论】:

      猜你喜欢
      • 2020-08-07
      • 2016-11-07
      • 1970-01-01
      • 2014-01-15
      • 1970-01-01
      • 2016-12-24
      • 2021-12-31
      • 2019-11-05
      • 2019-09-18
      相关资源
      最近更新 更多