对数字进行分类
实际应用场景:将字节分成几类:控制字符、可打印字符和不可打印字符(类别列表会更长)
我有一串数字:
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])
如果你的数字在某个特定的范围内,你也可以使用一个向量来查找: