我想要写一个更干净的版本的代码。这大约是两个不同的行组成的数字,必须编织。我已经在此链接上问过这个问题了,但是我已经用英语翻译了我的代码,这样可以更容易地帮助我改进它。
这是我目前正在学习的一门课程的作业:
旅行者,如果要获得财富,解决之道只需编织。编织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,3class Coordinate:
def __init__(self, x_coord, y_coord):
self.x_coord = x_coord
self.y_coord = y_coord
def calculate_new_coord(self):
self.x_coord += 1
self.y_coord += 0
return self.x_coord, self.y_coordclass CoordinateRow:
def __init__(self, row):
self.row = row
def append(self, coord):
self.row += [coord]
def extend(self, row):
for coordinate in row:
self.row += [coordinate]
def weave(self, weaveRow):
result = CoordinateRow([])
for i in range(len(self.row)):
if i < len(self.row):
result.append(self.row[i])
if i < len(weaveRow.row):
result.append(weaveRow.row[i])
if len(weaveRow.row) > len(self.row): #Als 2e rij(te weaven door 1e rij) groter dan 1e rij(bestaande rij)
result.extend(weaveRow.row[len(self.row):]) #voeg het verschil toe aan result
return resultfile_input = file.read()
strip_file = file_input.strip()
splits_file = strip_file.split("=")
from Coordinate import Coordinate
from CoordinateRow import CoordinateRow
def get_weaved_rows(splits_bestand):
rows = []
for i in range(len(splits_bestand)):
rows += [CoordinateRow(splits_bestand[i].split())]
previous_row = rows[0]
for row in rows[1:]:
previous_row = previous_row.weave(row)
return previous_row
def get_new_coordinates(weaved_rows):
for coordinate in weaved_rows.row:
current_coordinates = Coordinate(int(coordinate[0]), int(coordinate[2])) #coordinaat x[0] en y[2] worden int(x,y)
new_coordinates = current_coordinates.calculate_new_coord() #coordinaten (x,y) na verwerking
print '%d,%d' %(new_coordinates[0], new_coordinates[1])
weaved_rows = get_weaved_rows(splits_file)
get_new_coordinates(weaved_rows)发布于 2016-12-04 14:32:50
有些东西是可以改进的。
例如,可以使用weave重写itertools方法,有关示例,请参阅这是如此的帖子。其想法是通过迭代器(函数类似于zip --参见izip_longest)、chain和filter out Nones组合元素,这些元素可能是从缺少的对应程序中添加的。
然后,这个模式:
rows = []
for i in range(len(splits_bestand)):
rows += [CoordinateRow(splits_bestand[i].split())] 可以用更简洁的理解来代替:
rows = [CoordinateRow(sb.split()) for sb in splits_bestand]而且,Python有extend方法,它可以直接在.extend方法中使用,比如:self.row.extend(row)。类似于append方法。如果你在使用itertools之后会需要这些。
以前的raw代码也可以很容易地用itertools重写。留作练习。
发布于 2016-12-04 15:00:42
正如@RomanSusi在他的答复中提到的那样,lists已经有了一个append和extend方法。不过,他没有说的是,这意味着您的类CoordinateRow可能只是内置list的扩展,并添加了weave方法。
子类list的另一个优点是您可以获得len、空构造函数、内容打印和免费索引。您甚至不需要定义构造函数,因为它不会对list 1进行更改:
class CoordinateRow(list):
def weave(self, weaveRow):
result = CoordinateRow()
for i in range(len(self)):
if i < len(self):
result.append(self[i])
if i < len(weaveRow):
result.append(weaveRow[i])
if len(weaveRow) > len(self):
result.extend(weaveRow[len(self):])
return resulthttps://codereview.stackexchange.com/questions/148903
复制相似问题