0

我使用下面的代码部分

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
  1. 有没有什么好的数据结构来存储上面的数据?

  2. 如何将 (0,) 转换为(字符串的)键?

  3. 稍后我还需要按 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
4

3 回答 3

4

有没有什么好的数据结构来存储上面的数据?

collections.namedtuple

如何将 (0,) 转换为(字符串的)键?

你实际上不需要。由于(0,)是元组且元组是可散列的,因此可以直接用作键。

稍后我还需要按 kweight 对列表进行排序,是否可以使用可以调用某些 python 排序函数的数据结构?

sorted(dictofnamedtuples.values(), key=operator.attrgetter('kweight'))
于 2013-06-25T11:50:36.947 回答
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)}
于 2013-06-25T11:51:07.950 回答
-1

您基本上是在生成 2^n - 1 个数字,其中 n 是 num_item。所以您可以使用位操作来获得上述结果。

从 0 到 2^n - 1 迭代 i:
查找 i 的二进制:
检查每个设置的位,该位的位置(从 1 开始)将为您提供所需的组合。

于 2013-06-25T11:58:50.053 回答