真实世界应用程序:将字节分类为类别:控制,可打印,不可打印的字符(类别列表将更长)
我有一个数字列表:
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个条目写一个列表/字典?
答案 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查找值比迭代它们并对你的密钥进行强力搜索要好得多。我不确定这是否完全回答了你的问题,但它似乎至少是它的一部分。