对章节编号进行排序,如1.2.1或1.4.2.4

时间:2013-02-13 19:51:42

标签: python google-app-engine sorting

我有模型章节:

class Chapter(ndb.Model):
    tutKey = ndb.KeyProperty(kind='Tutorial')
    title = ndb.StringProperty(required=True)
    content = ndb.TextProperty(required=True)
    note = ndb.TextProperty()
    lvl = ndb.IntegerProperty(default=0)
    order = ndb.IntegerProperty(default=0)
    parentID = ndb.KeyProperty(kind='Chapter')
    number = ndb.IntegerProperty()

'number'是基础章节(第1章或第1.2章的数字= 1)。 'lvl'是章节的深度,例如,在第1.1.1章中,lvl是3,在第1.1.1.1节中,lvl是4.而'order'表示chap的顺序,例如,在第1章中.2'order'是2,在chap2.2''order'也是2。

我如何对以下章节进行排序(例如)?

chapter 2
chapter 2.1
chapter 1.1.1
chapter 1.1
chapter 1

我一直在想......我应该创建一个StringProperty来保存章节号,如“1.2.1”,然后将字符串拆分为'。' ?


编辑:我创建了一个ndb.IntegerProperty(repeated = True),相当于JBernardo建议的ListProperty。我能够正确存储数据,但我无法通过属性进行排序。谁知道怎么做?

3 个答案:

答案 0 :(得分:3)

您可以使用子章节最大深度的长度来表示您的章节。未使用的子章节由零表示。接下来将代表您的章节:

chapter 2      (2, 0, 0)
chapter 2.1    (2, 1, 0)
chapter 1.1.1  (1, 1, 1)
chapter 1.1    (1, 1, 0)
chapter 1      (1, 0, 0)

如果将这些章节添加到列表l中,则可以按列表“sort方法对此列表进行排序。

chapters = [(2, 0, 0), (2, 1, 0), (1, 1, 1), (1, 1, 0), (1, 0, 0)]
chapters.sort()
print chapters

这给出了:

[(1, 0, 0), (1, 1, 0), (1, 1, 1), (2, 0, 0), (2, 1, 0)]

---编辑---

如果是动态比较,您可以通过sort选项向key方法添加一个函数。在排序之前,此函数将应用于列表的每个元素。在以下expandChapter中,将章ch扩展为深度depthkey中的sort参数只接受一个参数。因此,系统会计算最大深度maxdepth,并通过匿名expandChapters函数将sort提供给lambda

def expandChapter(ch, depth):
    ch = ch + (0,) * (depth - len(ch))
    return ch

print expandChapter((1,), 3)                                # prints (1, 0, 0)

chapters = [(2,), (2, 1,), (1, 1, 1,), (1, 1), (1,)]
maxdepth = max([len(i) for i in chapters])
print maxdepth                                              # prints 3

chapters.sort(key = lambda x: expandChapter(x, maxdepth))
print chapters

这给出了正确答案:

[(1,), (1, 1), (1, 1, 1), (2,), (2, 1)]

答案 1 :(得分:0)

我想到的第一件事就是设置你的路线来处理章节,以便有类似的东西:

1/1
1/2/1

答案 2 :(得分:0)

找到一种更简单的方法来解决我的问题。 我以不同的方式存储章节。在ndb.IntegerProperty(repeated=True)。这样我只能使用它来排序:

newChaps = sorted(chaps, key=lambda obj: obj.version)

其中'version'是ndb.IntegerProperty。

完成。