У меня есть следующий список списков, который содержит 6 записей:Как группировать список-из-списка дистанцией условия в Python
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
(т. Е. 2-й элемент)
Я бы хотел «скопировать» приведенный выше список примерно следующих шагов:
- Выберите наименьшую позицию (по запросу. e2) в
lol
качестве ключа первого кластера - Присвоить, что в качестве первого члена кластера (словарь списка)
- Вычислить текущую e3 разницы в следующем списке с первым членом существующих кластеров.
- Если разница меньше порога, назначьте этот список как член соответствующего кластера Иначе создайте новый кластер с текущим списком в качестве нового ключа.
- Повторите остальные до конца
Окончательный результат будет выглядеть следующим образом, с порогом < = 0,1.
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
@Yax: '{'a': ['a', 'x'], 'b': ['b'], 'f': ['f'], 'k': ['k'], 'p': ['p']} ' – pdubois
Прости, я вышел, чтобы помолиться. Вы подумаете об этом, выполнив свой код. Теперь включите 'print diff> thress, thelist' в свой' else' оператор, чтобы увидеть подсказку, которую он дает. – Yax