如何优化我的代码?(建议)

2024-03-29 02:00:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Python新手,正在学习在线课程。我必须解决的问题之一是:

10.2编写一个程序来读取mbox-short.txt,并计算出每天每小时每条消息的分布情况。通过查找时间,然后使用冒号再次拆分字符串,可以从“from”行中提取小时

From xyz.abc@ab.cd.de Sat Jan 5 09:14:16 2008

累积每小时的计数后,打印计数,按小时排序,如下所示

我的代码是:

name = input("Enter file:")
if len(name) < 1 : name = "mbox-short.txt"
handle = open(name)
lst= []
lst2=[]
lst3=[]
ddd= {}

for l in handle:
    if l.startswith("From"):
        y= l.split()
        leg= len(y)
        if leg > 2:
            x= y[5]
            lst.append(x)


for h in lst:
    y= h.split(":")
    x= y[0]
    lst2.append(x)

for v in lst2:
    ddd[v]= ddd.get(v,0) + 1

for k, v in ddd.items():
    tup = (k, v)
    lst3.append (tup)

lst3= sorted(lst3)

for k, v in lst3:
    print (k, v)

给出此输出:

04 3
06 1
07 1
09 2
10 3
11 6
14 1
15 2
16 4
17 2
18 1
19 1

这实际上是正确的答案。然而,我确信这段代码对大多数人来说都很可怕。你对我或我未来的编码有什么建议吗?我希望能够优化我的代码,而不是只写我想到的任何东西。对不起,如果我的英语不好


1条回答
网友
1楼 · 发布于 2024-03-29 02:00:03

签出PythonPEP 8以获取样式建议

一些建议(其他人可能不同意)

  1. 如果在同一行上有条件(有时可以,但不鼓励长行)

更改:

if len(name) < 1 : name = "mbox-short.txt"

致:

if len(name) < 1 : 
  name = "mbox-short.txt"
  1. 在第一次使用时初始化变量

因此,请删除顶部的这些初始化,因为它们不提供上下文

lst= []
lst2=[]
lst3=[]
ddd= {}
  1. 使用大量非描述性变量名的代码更难理解

发布的代码(非描述变量太多):

for l in handle:
    if l.startswith("From"):
        y= l.split()
        leg= len(y)
        if leg > 2:
            x= y[5]
            lst.append(x)

改为:

times = []
for line in handle:
    if line.startswith("From"):
      fields = line.split()
      if len(fields) > 5:
        times.append(fields[5])

发布的代码(非描述变量太多):

for h in lst:
  y= h.split(":")
  x= y[0]
  lst2.append(x)

改为:

hours = []
for h in times:
  hours.append(h.split(":")[0])

或者更好(使用列表理解):

hours = [h.split(":")[0] for h in times]

重构代码

name = input("Enter file:")
if len(name) < 1 : 
  name = "mbox-short.txt"

with open(name) as handle:             # with is preferred over plain open
  times = []
  for line in handle:
      if line.startswith("From"):
        fields = line.rstrip().split() # strip to get rid of '\n'
        if len(fields) > 5:
          times.append(fields[5])

hours = [h.split(":")[0] for h in times]  # list comprehension

counts = {}
for v in hours:
    counts[v]= counts.get(v,0) + 1

counts = sorted(counts.items())              # create tuples and sort

for k, v in counts:
    print (k, v)

相关问题 更多 >