【发布时间】:2015-01-15 04:18:17
【问题描述】:
我有以下包含 6 个条目的列表:
lol = [['a', 3, 1.01],
['x', 5, 1.00],
['k', 7, 2.02],
['p', 8, 3.00],
['b', 10, 1.09],
['f', 12, 2.03]]
lol 中的每个子列表包含 3 个元素:
['a', 3, 1.01]
e1 e2 e3
上面的列表已经按照e2(即第二个元素)排序
我想大致按照以下步骤“聚类”上述列表:
- 选择
lol中最低的条目(wrt.e2)作为第一个集群的键 - 将其指定为集群的第一个成员(列表字典)
- 计算下一个列表中与第一个成员的差值电流 e3 现有集群。
- 如果差值小于阈值,则将该列表指定为 对应集群的成员 否则,使用当前列表作为新键创建新集群。
- 重复其余部分直到完成
最终结果将如下所示,阈值
dol = {'a':['a', 'x', 'b'],
'k':['k', 'f'],
'p':['p']}
我对此感到困惑,正确的做法是什么:
import json
from collections import defaultdict
thres = 0.1
tmp_e3 = 0
tmp_e1 = "-"
lol = [['a', 3, 1.01], ['x', 5, 1.00], ['k', 7, 2.02],
['p', 8, 3.00], ['b', 10, 1.09], ['f', 12, 2.03]]
dol = defaultdict(list)
for thelist in lol:
e1, e2, e3 = thelist
if tmp_e1 == "-":
tmp_e1 = e1
else:
diff = abs(tmp_e3 - e3)
if diff > thres:
tmp_e1 = e1
dol[tmp_e1].append(e1)
tmp_e1 = e1
tmp_e3 = e3
print json.dumps(dol, indent=4)
【问题讨论】:
-
print json.dumps(dol, indent=4)给你什么? -
@Yax:
{'a': ['a', 'x'], 'b': ['b'], 'f': ['f'], 'k': ['k'], 'p': ['p']} -
对不起,我出去祈祷了。您将通过执行代码来考虑这一点。现在,在您的
else语句中包含print diff > thress, thelist以查看它给出的提示。 -
记住第一个列表也将满足您的条件,现在将成为 5。
-
OT:我推荐
pprint.pprint(data)而不是print json.dumps(data)
标签: python algorithm cluster-analysis