我使用下面的代码部分
num_item = 3
for i in range(1,num_item+1):
list(itertools.combinations(range(0,num_item), i))
生成组合列表
[[(0,), (1,), (2,)], [(0, 1), (0, 2), (1, 2)], [(0, 1, 2)]]
我想将这些组合作为两个值的关键:kvalue和kweight,如下例所示
key 1 : (0,) , value 1 : kvalue = 8 kweight = 4
key 2 : (1,) , value 2 : kvalue = 10 kweight = 5
key 3 : (2,) , value 3 : kvalue = 15 kweight = 8
上面存储数据有什么好的数据结构吗?
如何将(0,)转换为(字符串)键?
我还需要稍后用kweight对列表进行排序,是否可以使用可调用某些python排序函数的数据结构?
编辑:我想我应该扩展上面的例子。我想将(0,1,2)存储为键7,该键有2个值:kvalue = -1,kweight = 9
key 1 : (0,) , value 1 : kvalue = 8 kweight = 4
key 2 : (1,) , value 2 : kvalue = 10 kweight = 5
key 3 : (2,) , value 3 : kvalue = 15 kweight = 8
key 4 : (0, 1) , value 4 : kvalue = 18 kweight = 9
key 5 : (0, 2) , value 5 : kvalue = -1 kweight = 4
key 6 : (1, 2) , value 6 : kvalue = -1 kweight = 5
key 7 : (0, 1, 2) , value 7 : kvalue = -1 kweight = 9
答案 0 :(得分:4)
上面存储数据是否有良好的数据结构?
如何将(0,)转换为键(字符串)?
你实际上并不需要。由于(0,)
是一个元组,而元组是可清除的,因此它可以直接用作密钥。
我还需要稍后用kweight对列表进行排序,是否可以使用可以调用某些python排序函数的数据结构?
sorted(dictofnamedtuples.values(), key=operator.attrgetter('kweight'))
答案 1 :(得分:1)
您可以使用嵌套字典或创建值对象。
{0:{'value':1, 'kvalue':8, 'kweight':4}}
或
class Value:
def __init__(self, value, kvalue, kweight):
self.value = value
self.kvalue = kvalue
self.kweight = kweight
{0:Value(1,8,4)}
答案 2 :(得分:-1)
你基本上生成2 ^ n - 1个数字,其中n是num_item .. 因此,您可以使用位操作来获得上述结果。
迭代i从0到2 ^ n - 1:
找到i的二进制:
检查每个设置位,该位的位置(从1开始)将为您提供所需的组合。