我想写一个更干净的代码版本,如下所示。这大约是两个不同的行组成的数字,必须编织。
这是我目前正在学习的一门课程的作业。这是一项任务:
旅行者,如果要获得财富,解决之道只需编织。编织5, 4 ,5,8,7编织6, 3 ,2,9,6,3编织7,6编织9,8编织5,5,8,6,6,4
我必须从第一行的坐标开始,把第二行的坐标编织到第一行,然后再把第三行的坐标编织到产生的行中等等。注意,如果要编织两排不等长的行,这两行要尽可能地编织。在耗尽最短行的元素后,将通过添加最长行的其余元素来完成该行。
输入如下:
5,4 4,5 8,7=6,3 3,2 9,6 4,3=7,6=9,8=5,5 7,8 6,5 6,4输出必须是这样的:
6,4
6,5
10,8
8,8
8,6
7,5
7,3
7,4
5,5
4,2
9,7
10,6
5,3我的代码在三个文件里。
class Coordinaat:
def __init__(self, x_coordinaat, y_coordinaat):
self.x_coordinaat = x_coordinaat
self.y_coordinaat = y_coordinaat
def bereken_nieuw_coordinaat(self):
self.x_coordinaat += 1
self.y_coordinaat += 0
return self.x_coordinaat, self.y_coordinaatclass CoordinaatRij:
def __init__(self, rij):
self.rij = rij
def voeg_toe(self,coordinaat):
self.rij += [coordinaat]
def breid_uit(self, rij):
for coordinaat1 in rij:
self.rij += [coordinaat1]
def weave(self, weef_rij):
resultaat = CoordinaatRij([])
for i in range(len(self.rij)):
if i < len(self.rij):
resultaat.voeg_toe(self.rij[i])
if i < len(weef_rij.rij):
resultaat.voeg_toe(weef_rij.rij[i])
if len(weef_rij.rij) > len(self.rij):
resultaat.breid_uit(weef_rij.rij[len(self.rij):])
return resultaatfile_input = file.read()
strip_file = file_input.strip()
invoer = strip_file.split("=")
from Coordinaat import Coordinaat
from CoordinaatRij import CoordinaatRij
def nieuwe_rijen(invoer):
rijen = []
for i in range(len(invoer)):
rijen += [CoordinaatRij(invoer[i].split())]
vorige_rij = rijen[0]
for rij in rijen[1:]:
vorige_rij = vorige_rij.weave(rij)
return vorige_rij
def nieuwe_coordinaten(geweefde_rijen):
for coordinaat1 in geweefde_rijen.rij:
huidige_coordinaten = Coordinaat(int(coordinaat1[0]), int(coordinaat1[2]))
nieuwe_coordinaten = huidige_coordinaten.bereken_nieuw_coordinaat()
print '%d, %d' %(nieuwe_coordinaten[0], nieuwe_coordinaten[1])
geweefde_rijen = nieuwe_rijen(invoer)
nieuwe_coordinaten(geweefde_rijen)发布于 2016-12-02 18:41:21
英语代码读起来更好,因为Python标准库是英语。不过,如果你使用荷兰语,请坚持这样做。不要把file_input和invoer,或者def weave(self, weef_rij)混在一起。
很难理解要执行的任务是什么,以及这些代码是做什么的。Docstring和博士考试是个好主意。
在整个地方进行部分解析是很尴尬的:
strip_file = file_input.strip()和strip_file.split('=')在主代码中。特别糟糕的是,这个片段放在导入之前和下一行代码(geweefde_rijen = nieuwe_rijen(invoer))之前。invoer[i].split()在nieuwe_rijen()中。int(coordinaat1[0]), int(coordinaat1[2])在nieuwe_coordinaten()中。最好是同时完成所有的解析,形成一个整数对的列表。不仅代码更容易理解,而且如果输入无效,也会让程序更早地失败。
我想你在这里做得太过分了。定义Coordinaat类(基本上只是一个元组)或CoordinaatRij (基本上只是一个列表)没有多大意义。这份工作你所需要的只是一些功能。
具体来说,利用itertools.izip_longest()是非常有用的,因为它是您所要做的工作的核心。然后,要对后续行重复转换结果,请使用reduce()函数。
from itertools import chain, izip_longest
def coordinaatrijen_parsen(tekenreeks, rij_scheidingsteken='\n'):
"""
Yield each row of coordinates as a list of (int, int).
>>> list(coordinaatrijen_parsen('1,2 3,4= 5,6 ', '='))
[[(1, 2), (3, 4)], [(5, 6)]]
"""
for rij in tekenreeks.split(rij_scheidingsteken):
yield [
tuple(int(c) for c in coord.split(','))
for coord in rij.split()
]
def weven(*rijen):
"""
Interleave elements from the parameters.
>>> weven('Geeogn', 'odmre')
['G', 'o', 'e', 'd', 'e', 'm', 'o', 'r', 'g', 'e', 'n']
>>> weven('Gee', 'odmorgen')
['G', 'o', 'e', 'd', 'e', 'm', 'o', 'r', 'g', 'e', 'n']
>>> weven('Gd', 'o', 'eemorgen')
['G', 'o', 'e', 'd', 'e', 'm', 'o', 'r', 'g', 'e', 'n']
"""
return filter(None, chain(*izip_longest(*rijen)))
if __name__ == '__main__':
with open(...) as f:
rijen = coordinaatrijen_parsen(f.read(), '=')
resultaat = [(x + 1, y) for x, y in reduce(weven, rijen, [])]
for coord in resultaat:
print '%d, %d' % coordhttps://codereview.stackexchange.com/questions/148758
复制相似问题