从嵌套字典值(树)创建列表列表

时间:2020-06-19 12:05:25

标签: python list dictionary recursion nested

我已经使用层次聚类来创建聚类树。

结果是:

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]] ]

我最后要说的是“根据值列出列表”。

谢谢

2 个答案:

答案 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:]