首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编写行的Python代码

编写行的Python代码
EN

Code Review用户
提问于 2016-12-02 15:38:37
回答 1查看 1.1K关注 0票数 6

我想写一个更干净的代码版本,如下所示。这大约是两个不同的行组成的数字,必须编织。

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

旅行者,如果要获得财富,解决之道只需编织。编织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

我的代码在三个文件里。

Coordinaat.py

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

CoordinaatRij.py

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

摘录主要代码

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

回答 1

Code Review用户

发布于 2016-12-02 18:41:21

英语代码读起来更好,因为Python标准库是英语。不过,如果你使用荷兰语,请坚持这样做。不要把file_inputinvoer,或者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()函数。

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

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

复制
相关文章

相似问题

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