【问题标题】:How to format this dictionary in a specific way如何以特定方式格式化此字典
【发布时间】:2022-01-04 11:06:57
【问题描述】:

我正在制作一个程序来计算文件中每个字符串的出现次数,所以我写了这个

f = open('strings.txt', 'r')
content = f.read()
mystr = list(content)
data = {k: mystr.count(k) for k in mystr}
print(data)

例如,我如何以这样的格式打印输出

 whitespace = 286
 "e" = 204
 "n" = 164
 "i" = 156
 "a" = 147

【问题讨论】:

  • 您正在重新实现collections.Counterdata = Counter(f.read()) 可以替换所有现有代码。你也可以使用Counter.most_common():print(*(f'"{k}" = {v}' for k, v in data.most_common()), sep="\n")
  • 另一种方式是 str = json.dumps(data, indent=0,separators=('', ':' )) print(str[2:-2])

标签: python formatting


【解决方案1】:

[f'{i}={j}' for i,j in data.items()]

【讨论】:

  • 要打印这个你需要做print('\n'.join([f'{i}={j}' for i,j in data.items()]))
  • 请记住,Stack Overflow 不仅仅是为了解决眼前的问题,而是为了帮助未来的读者找到类似问题的解决方案,这需要了解底层代码。这对于我们社区的初学者和不熟悉语法的成员来说尤其重要。鉴于此,您能否edit 您的答案包括对您正在做什么的解释以及为什么您认为这是最好的方法?
【解决方案2】:

使用python string format:

for key, value in data.items():
    print("{}={}".format(key, value))

但是您的解决方案效率不高,collections.Counter 已经用更有效的方式解决了这个问题:

from collections import Counter
words = ['x','y','z','x','x','x','y', 'z']
print(Counter(words))

# Counter({'x': 4, 'y': 2, 'z': 2})

要对结果进行排序,您可以像这样使用sorted

x = Counter(words)
sorted(x.items(), key=lambda i: i[1])

sorted(x.items(), key=lambda i: i[1], reverse=True)  # to sort in ascending order

【讨论】:

  • 如何按数量降序排列?
  • @Gaemon,如果你使用collections.Counter,有具体的方法Counter.most_common()。如果您(出于某些原因) 使用常规字典,则需要应用sorted() 并将itemgetter() 传递给key 参数:sorted(data.items(), key=itemgetter(1), reverse=True)
  • @Gaemon 查看我的更新答案。
  • @MojtabaKamyabi,不要使用lambda按索引检索元素,有operator.itemgetter()。千万不要对Counter使用排序方法,这是有特定方法的。
  • @OlvinR​​oght operator 需要导入。无论如何,在这种情况下使用 lambda 有什么缺点?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-25
  • 1970-01-01
  • 2021-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多