我已经使用层次聚类来创建聚类树。
结果是:
dic = {6: {2: 2, 5: {3: 3, 4: {0: 0, 1: 1}}}}
根据聚类列出列表:
[ [[6]],
[[2], [5]],
[[2], [3], [4]],
[[2], [3], [0], [1]] ]
根据值列出列表:
[ [[2, 3, 0, 1]],
[[2], [3, 0, 1]],
[[2], [3], [0, 1]],
[[2], [3], [0], [1]] ]
我最后要说的是“根据值列出列表”。
谢谢
答案 0 :(得分:1)
我为此花了太多时间:
def list_of_list(d):
if type(d)!=dict:
return [[[d]]]
results=[]
for k,value in d.items():
results.append(list_of_list(value))
L=len(max(results,key=len))
for i in range(len(results)):
j=len(results[i])
results[i].extend([results[i][j-1]]*(L-j))
outputtop=[v for result in results for v in result[0][0]]
output=[[outputtop]]
for l in range(L):
output.append([ val for result in results for val in result[l]])
return output
答案 1 :(得分:1)
from tkinter import *
import sqlite3
from tkinter import ttk
class AutocompleteCombobox(ttk.Combobox):
def set_completion_list(self, completion_list):
"""Use our completion list as our drop down selection menu, arrows move through menu."""
self._completion_list = sorted(completion_list, key=str.lower) # Work with a sorted list
self._hits = []
self._hit_index = 0
self.position = 0
self.bind('<KeyRelease>', self.handle_keyrelease)
self['values'] = self._completion_list # Setup our popup menu
def autocomplete(self, delta=0):
"""autocomplete the Combobox, delta may be 0/1/-1 to cycle through possible hits"""
if delta: # need to delete selection otherwise we would fix the current position
self.delete(self.position, END)
else: # set position to end so selection starts where textentry ended
self.position = len(self.get())
# collect hits
_hits = []
for element in self._completion_list:
if element.lower().startswith(self.get().lower()): # Match case insensitively
_hits.append(element)
# if we have a new hit list, keep this in mind
if _hits != self._hits:
self._hit_index = 0
self._hits=_hits
# only allow cycling if we are in a known hit list
if _hits == self._hits and self._hits:
self._hit_index = (self._hit_index + delta) % len(self._hits)
# now finally perform the auto completion
if self._hits:
self.delete(0,END)
self.insert(0,self._hits[self._hit_index])
self.select_range(self.position,END)
def handle_keyrelease(self, event):
"""event handler for the keyrelease event on this widget"""
if event.keysym == "BackSpace":
self.delete(self.index(INSERT), END)
self.position = self.index(END)
if event.keysym == "Left":
if self.position < self.index(END): # delete the selection
self.delete(self.position, END)
else:
self.position = self.position-1 # delete one character
self.delete(self.position, END)
if event.keysym == "Right":
self.position = self.index(END) # go to end (no selection)
if len(event.keysym) == 1:
self.autocomplete()
# No need for up/down, we'll jump to the popup
# list at the position of the autocompletion
def test(test_list):
"""Run a mini application to test the AutocompleteEntry Widget."""
root = Tk(className='AutocompleteCombobox')
combo = AutocompleteCombobox(root)
combo.set_completion_list(test_list)
combo.pack()
combo.focus_set()
# I used a tiling WM with no controls, added a shortcut to quit
root.bind('<Control-Q>', lambda event=None: root.destroy())
root.bind('<Control-q>', lambda event=None: root.destroy())
root.mainloop()
if __name__ == '__main__':
test_list = ('apple', 'banana', 'Cranberry', 'dogwood', 'alpha', 'Acorn', 'Anise', 'Strawberry' )
test(test_list)
展平输入数组
flat
递归地遍历树并解压缩值
最终列表理解,其生成与提取的值数相同长度的数组
每个数组元素都是一个数组,其中包含来自l({walk
)的x个单值数组和l(l[i:i+1]
)中其余元素的数组切片
l[x:]