【问题标题】:Sort result from dictionary read from CSV file从 CSV 文件读取的字典中排序结果
【发布时间】:2021-12-24 20:27:40
【问题描述】:

我有一个包含许多列和行的 CSV 文件,我想从具有重复项的特定行(代码中显示的第 12 行)创建一个字典。我已经设法做到了,但是,我不知道如何对其进行排序。我尝试在创建字典之前和之后对其进行排序。 我通过 VSCode 使用 python。

这是我的代码:

import csv


with open("FILENAME", newline="", encoding="iso-8859-1") as csvfile:
    reader = csv.reader(csvfile, delimiter=";")
    next(reader)
    species_count ={}
    for row in reader:
        species = row[12]
        species_count[species] = species_count.get(species,0)+1
    for num in species_count:
        print(f"{num}: {species_count[num]}")

当前结果示例:

A: 5922
C: 5837
D: 6136
B: 12
E: 1

等等

有没有简单的方法来做到这一点? 任何帮助表示赞赏! (我是初学者)

编辑: 我想按字母顺序排序,所以:

A: 5922
B: 12
C: 5837
etc

【问题讨论】:

  • 你希望结果是什么?
  • 我希望它按字母顺序按第一个值排序。可能应该在我的问题中指定,对不起!
  • row[12] 不是第 12 行。它是当前行中的第 12 元素。换句话说,您是从第 12 列中获取元素,而不是从第 12 行中获取元素。
  • 所以从字典中获取键列表并对其进行排序。
  • 另外,请注意dict 的子类Counter 在模块collections 中,它基本上实现了所有的计数逻辑,因此您不必自己编写。您可以使用from collections import Counter; species_count = Counter(row[12] for row in reader) 并在一行代码中完成所有操作。

标签: python csv sorting


【解决方案1】:

这里是source

lambda 函数是为了缩短 for 循环。 x 是指字典的项目。字典项包含键和值。键是索引 0 x[0] 处的 x,x[1] 指的是值。因为我们要对字典的键进行排序。

sorted 是内置函数,您可以使用 sorted 按字母顺序对字典进行排序。

sortedDict = dict(sorted(species_count.items(), key = lambda x: x[0]))
print(sortedDict)

结果

{'A': 5922, 'B': 12, 'C': 5837, 'D': 6136, 'E': 1}

【讨论】:

  • 您能否详细说明您的答案以及该解决方案的工作原理?谢谢!
  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
【解决方案2】:

对字典中的元素进行排序

你的代码很不错,你只需要替换最后的显示循环

for num in species_count:

species_count的内容的排序版本上有一个循环。

很方便,使用内置函数sorted 可以轻松地获得一个集合的排序版本。可以对字典的键列表进行排序,也可以直接对(key, value)列表进行排序。

# version 1
for num in sorted(species_count):
    print(f"{num}: {species_count[num]}")

# version 2
for s,c in sorted(species_count.items()):
    print(f'{s}: {c}')

我更喜欢第 2 版,尽管这是个人喜好问题。它们几乎(但不完全)等价。

代码中的其他 cmets

使用 collections.Counter

您在循环中使用d[k] = d.get(k,0)+1 来构建计数字典效果很好。然而,由于这是一件非常经典的事情,并且在很多情况下都非常有用,所以 python 中有一个 dict 的子类可以为您处理所有这些逻辑。子类称为Counter,可在模块collections 中找到。使用该类,可以在一行简单的代码中构建计数字典:

from collections import Counter

species_count = Counter(row[12] for row in reader)

打开和关闭文件

像您一样使用with 块的最大优势在于它会为您关闭文件。当with 块结束时,文件关闭。在我看来,你应该在读完文件后立即关闭with 块。所以,最终的显示循环for num in sorted(species_count): 应该在with 块之外。

最终代码

import csv
from collections import Counter

with open("FILENAME", newline="", encoding="iso-8859-1") as csvfile:
    reader = csv.reader(csvfile, delimiter=";")
    next(reader)
    species_count = Counter(row[12] for row in reader)

for s,c in sorted(species_count.items()):
    print(f'{s}: {c}')

【讨论】:

    猜你喜欢
    • 2021-08-20
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 2023-01-08
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多