首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >列一个街头女郎的名单

列一个街头女郎的名单
EN

Stack Overflow用户
提问于 2020-04-16 15:47:33
回答 1查看 47关注 0票数 0

解题:-)我有这个名单,想要得到预期的结果,但没有运气。在python和FME中尝试过

如果当前数字与前一个数字之间有2以上,则必须启动一个新行。

有人能帮忙吗?在FME中更好,但在python中也不错

代码语言:javascript
运行
复制
StreetName;HouseNumber;OddEven
Northroad;1;O
Northroad;2;E
Northroad;3;O
Northroad;4;E
Northroad;8;E
Northroad;10;E
Southroad;1;O
Southroad;2;E
Southroad;3;O
Southroad;4;E
Southroad;10;E
Southroad;12;E
Southroad;14;E

我的结果是:

代码语言:javascript
运行
复制
Northroad 1-3
Northroad 2-10
Southroad 1-3
Southroad 2-14

预期结果:

代码语言:javascript
运行
复制
Northroad 1-3
Northroad 2-4
Northroad 8-10
Southroad 1-3
Southroad 2-4
Southroad 10-14

这有什么意义吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-16 17:14:20

这是一个中等复杂的解析、处理和格式化任务,因此我将使用类:一个用于道路一侧的连续地址范围,另一个用于该范围的容器。这样,加载接口就像添加解码行一样简单,而格式化接口也将一样简单。

代码可以是:

代码语言:javascript
运行
复制
# set the filenames here:
filename = "input.csv"
out = output.txt
class AddressRange:
    def __init__(self, row):
        self.road = row[0]
        self.low = self.high = int(row[1])
        self.side = row[2]

    def add(self, row):
        if (self.road != row[0]) or (self.side != row[2]):
            return False
        val = int(row[1])
        if val < self.low <= val+2:
            self.low = val
        elif val-2 <= self.high < val:
            self.high = val
        else:
            return False
        return True
    def __str__(self):
        return '%s %d-%d' % (self.road, self.low, self.high)

class AddressList:
    def __init__(self):
        self.ranges = []
    def add(self, row):
        for ar in self.ranges:
            if ar.add(row):
                break
        else:
            self.ranges.append(AddressRange(row))
    def print(self, fd=sys.stdout):
        for ar in self.ranges:
            print(str(ar), file=fd)


with open(filename) as fd:
    rd = csv.reader(fd, delimiter = ';')
    lst = AddressList()
    _ = next(fd)              # skip header line
    for row in rd:
        if len(row) == 3:
            lst.add(row)

with open(out, 'w') as fd:
    lst.print(out)

对于示例输入文件,输出如预期的那样:

代码语言:javascript
运行
复制
Northroad 1-3
Northroad 2-4
Northroad 8-10
Southroad 1-3
Southroad 2-4
Southroad 10-14
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61254436

复制
相关文章

相似问题

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