首页
学习
活动
专区
圈层
工具
发布

织行数
EN

Code Review用户
提问于 2016-12-04 14:03:39
回答 2查看 1.4K关注 0票数 3

我想要写一个更干净的版本的代码。这大约是两个不同的行组成的数字,必须编织。我已经在此链接上问过这个问题了,但是我已经用英语翻译了我的代码,这样可以更容易地帮助我改进它。

这是我目前正在学习的一门课程的作业:

旅行者,如果要获得财富,解决之道只需编织。编织5, 4 ,5,8,7编织6, 3 ,2,9,6,3编织7,6编织9,8编织5,5,8,6,6,4

我必须从第一行的坐标开始,把第二行的坐标编织到第一行,然后再把第三行的坐标编织到产生的行中等等。注意,如果要编织两排不等长的行,这两行要尽可能地编织。在耗尽最短行的元素后,将通过添加最长行的其余元素来完成该行。

输入如下(我的代码已经返回了所需的输出):

代码语言:javascript
复制
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

输出必须是这样的:

代码语言:javascript
复制
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

Coordinate.py

代码语言:javascript
复制
class 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_coord

CoordinateRow.py

代码语言:javascript
复制
class 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 result

摘录主要代码

代码语言:javascript
复制
file_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)
EN

回答 2

Code Review用户

发布于 2016-12-04 14:32:50

有些东西是可以改进的。

例如,可以使用weave重写itertools方法,有关示例,请参阅这是如此的帖子。其想法是通过迭代器(函数类似于zip --参见izip_longest)、chainfilter out Nones组合元素,这些元素可能是从缺少的对应程序中添加的。

然后,这个模式:

代码语言:javascript
复制
rows = []
for i in range(len(splits_bestand)):
    rows += [CoordinateRow(splits_bestand[i].split())] 

可以用更简洁的理解来代替:

代码语言:javascript
复制
rows = [CoordinateRow(sb.split()) for sb in splits_bestand]

而且,Python有extend方法,它可以直接在.extend方法中使用,比如:self.row.extend(row)。类似于append方法。如果你在使用itertools之后会需要这些。

以前的raw代码也可以很容易地用itertools重写。留作练习。

票数 2
EN

Code Review用户

发布于 2016-12-04 15:00:42

正如@RomanSusi在他的答复中提到的那样,lists已经有了一个appendextend方法。不过,他没有说的是,这意味着您的类CoordinateRow可能只是内置list的扩展,并添加了weave方法。

子类list的另一个优点是您可以获得len、空构造函数、内容打印和免费索引。您甚至不需要定义构造函数,因为它不会对list 1进行更改:

代码语言:javascript
复制
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 result
票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/148903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档