对数字进行分类

时间:2012-02-07 14:02:16

标签: python

真实世界应用程序:将字节分类为类别:控制,可打印,不可打印的字符(类别列表将更长)

我有一个数字列表:

numbers = [1, 1, 2, 3, 3, 3, 3, 4]

现在我想把它们分成不同的类别。为此,我必须定义一个数字属于哪个类别。到目前为止,我有两种方法,都使用预定义的索引/值对。

category_list = ["apple", "apple", "banana", "melon", "melon", "melon"]
category_dict = {1 : "apple", 2 : "apple", 3 : "banana", 4 : "melon", 5 : "melon", 6 : "melon"}
for number in numbers:
    print category_list[number]
    category_dict[number]

另一个选项是每个类别的列表。这最终写入/实现的速度更快,但迫使我强行使用字典(参见其中一个答案):

dict_category = {
    apple : [1, 2],
    banana : [3,],
    melon : [4, 5, 6]
}
for number in numbers:
    for key, val in dict_category.iteritems():
        if number in val:
            print key
            break

有没有更好,更pythonic的方式来做到这一点?也许哪个不要求我用256个条目写一个列表/字典?

2 个答案:

答案 0 :(得分:3)

# configuration dict, written by the user
categories = {
    'apple'  : [1, 2],
    'banana' : [3],
    'melon'  : [4, 5, 6]
}

# dynamically generate lookup table
lookup = {}
for cat, nums in categories.iteritems():
    for n in nums: lookup[n] = cat

# ... later:
from collections import defaultdict
categorized = defaultdict(list)
for n in numbers:
    cat = lookup.get(n)
    if not cat:
        continue
    categorized[cat].append(n)
    print "put %d in category %s" % (n, cat)

如果您的数字在一定范围内,您还可以使用向量进行查找:

lookup = [None]*256
for cat, nums in categories.iteritems():
    for n in nums: lookup[n] = cat

# ... later
categorized = defaultdict(list)
for n in numbers:
    categorized[lookup[n]].append(n)
    print "put %d in category %s" % (n, lookup[n])

答案 1 :(得分:0)

通过索引从dict s查找值比迭代它们并对你的密钥进行强力搜索要好得多。我不确定这是否完全回答了你的问题,但它似乎至少是它的一部分。