对数字进行分类

-1 投票
2 回答
936 浏览
提问于 2025-04-17 12:30

实际应用场景:将字节分成几类:控制字符、可打印字符和不可打印字符(类别列表会更长)

我有一串数字:

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

有没有更好、更符合Python风格的方法呢?也许不需要我写一个有256个条目的列表或字典?

2 个回答

0

dict中通过索引查找值要比一个个遍历然后强行搜索你的键要好得多。我不确定这是否完全回答了你的问题,但这似乎至少是其中的一部分。

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])

如果你的数字在某个特定的范围内,你也可以使用一个向量来查找:

撰写回答