首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有功能记忆状态的群

具有功能记忆状态的群
EN

Stack Overflow用户
提问于 2015-04-26 07:21:43
回答 2查看 94关注 0票数 0

我正在处理许多行,根据当前行中的一个值x是否在上一行的值x的100以内对它们进行分组。

作为例子

代码语言:javascript
复制
5, "hello"
10, "was"
60, "bla"
5000, "qwerty"

"hello“、"was”和"bla“应该是一个组,另一个组是"qwerty”。

有什么办法可以用群比巧妙地解决这个问题吗?我能想到的所有解决方案都有点麻烦,比如每次调用groupby中的函数(键)时,都会使用带有先前值的dict默认参数,并更新它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-26 08:12:43

您只需编写一个简单的类来封装临时变量,然后使用该类的一个方法作为关键函数:

代码语言:javascript
复制
class KeyClass(object):
    def __init__(self):
        self.lastValue = None
        self.currentKey = 1

    def handleVal(self, val):
        if self.lastValue is not None and abs(val - self.lastValue) > 100:
            self.currentKey += 1
        self.lastValue = val
        return self.currentKey

>>> [(k, list(g)) for k, g in itertools.groupby(data, KeyClass().handleVal)]
[(1, [1, 2, 100, 105]), (2, [300, 350, 375]), (3, [500]), (4, [800, 808])]

为了好玩,我还想出了一种相当令人费解的方法,使用预高级生成器的send方法作为关键功能:

代码语言:javascript
复制
def keyGen():
    curKey = 1
    newVal = yield None
    while True:
        oldVal, newVal = newVal, (yield curKey)
        if oldVal is None or abs(newVal-oldVal) > 100:
            curKey += 1

key = keyGen()
next(key)

>>> [(k, list(g)) for k, g in itertools.groupby(data, key.send)]
[(1, [1, 2, 100, 105]), (2, [300, 350, 375]), (3, [500]), (4, [800, 808])]

把你的头绕着看,这可能是理解.send的一个很好的练习(这是给我的!)

票数 2
EN

Stack Overflow用户

发布于 2015-04-26 07:29:09

itertools.groupby可能有一些巧妙的技巧,但是它非常简单,可以为您的特定问题编写一个自定义生成器函数。也许是这样的(未经测试的):

代码语言:javascript
复制
def grouper(it):
    group = []
    for item in it:
        if not group or abs(int(item[0]) - int(group[-1][0])) < 100:
            group.append(item)
        else:
            yield group
            group = [item]
    if group:  # yield final group if not empty
        yield group

使用方式类似于

代码语言:javascript
复制
with open(filename) as fid:
    for group in grouper(line.split(',') for line in fid):
        # do something with group
        for item in group:
            # do something with item
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29874889

复制
相关文章

相似问题

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