【发布时间】:2016-02-06 23:07:32
【问题描述】:
我有一个字典(称为 dict),其键是表示特征名称的字符串,其值是表示每个特征计数的浮点数。
这是我的字典(dict)的一个例子:
{'11268-238-1028': 2.0, '1028': 10.0, '10295': 2.0, '1781': 2.0, '11268-238': 3.0, '6967-167': 1.0, '9742 -232-788': 1.0, '8542': 4.0, '238-1028': 5.0, '1028-122': 1.0}
在此示例中,“10295”被视为一度特征,“6967-167”被视为二度特征,“9742-232-788”是三度特征。如果我们有“x-x-x-x-x-x-x”,那么它将是一个七度特征。换句话说,对于任何 n 度特征,该特征具有 (n-1) 个破折号 ('-')。
'11268-238-1028': 2.0 表示 3 度特征 '11268-238-1028' 的计数为 2。然后我们看到 '11268-238': 3.0 表示 '11268-238 ' 出现 3 次。但是,这是一些重复计数问题,因为在 '11268-238' 的 3 次出现中,其中 2 次实际上是由于 '11268-238-1028' 的出现。因此,我们要将'11268-238'的计数改为它的真实计数,即3-2 = 1。
同样,“238-1028”的实际计数不是 5,因为“238-1028”是“11268-238-1028”的一部分,而“11268-238-1028”的计数为 2。所以,“238-1028”的实际计数应该是(5-2 = 3)。
另一个示例是特征“1028”,其实际计数不应为 10。“1028”是 3 度特征“11268-238-1028”的一部分,其计数为 2。“1028”也是计数为 5 的 2 度特征“238-1028”的一部分。“1028”也是计数为 1 的 2 度特征“1028-122”的一部分。因此,1-学位特征“1028”应该是(10-2-5-1 = 2)。
我应该使用什么样的算法来解决这个问题?
我考虑将每个键转换为由破折号分割的一组 1 度特征,然后对每个集合,针对所有其他长度更长的集合进行子集成员资格测试。但是, set 存储无序元素,但我关心顺序。例如,特征 '11268-238-1028' 转换为集合将是 (['11268', '238', '1028']);转换为 set 的另一个特征“11268-1028”将是 (['11268', '1028'])。如果我对这两个特征集执行子集测试,我会得出结论,(['11268', '1028']) 是 (['11268', '238', '1028']) 的子集。但是,特征“11268-1028”不是特征“11268-238-1028”的子集,因为在“11268”和“1028”之间,还有另一个“238”,即顺序应该很重要。
那我该如何解决这个问题呢?
非常感谢!
【问题讨论】:
-
你试过了吗?
-
不转换为set,而是拆分为像l='11268-238-1028'和l.split('-')这样的列表并连续比较
-
你甚至不需要这样做......
-
或检查是否为子串
标签: python python-2.7 dictionary set subset