[英]Creating a tree structure with dict and lists in Python for QTreeView
首先,我沒有練習,我試圖在 Python 3.8 中創建一個樹結構來提供我的 QTreeView。
我閱讀了 zfs (subprocess.check_output) 的輸出並將整個內容拆分為一個包含池名稱的列表:
示例列表:
pools = ['deadpool','deadpool/Backup','deadpool/Photos','deadpool/Photos/Foobar']
現在我必須按父/子轉換和排序整個列表,最后它應該是這樣的,這樣我就可以在 QTreeView 中使用它:
{'deadpool':
{
'Backup': {},
'Photos': {'Foobar': {}},
}
}
我用兩個 for 循環嘗試過,但我太愚蠢了..
有人可以告訴我一個簡單的例子嗎?
或者 QtTreeView/QTreeWidget 本身有更簡單的方法嗎?
如果我理解您的問題,您想從 dict 構建一個 treewidget 嗎? 如果是這樣,這是 Pyside2 的一個非常快速的示例(我認為 PyQt5 對於 Treewidget 沒有問題)。
data = {
'deadpool':{
'Backup': {},
'Photos': {
'Foobar': {}
}
}
}
def build_tree(data=None, parent=None):
for key, value in data.items():
item = QTreeWidgetItem(parent)
item.setText(0, key)
if isinstance(value, dict):
build_tree(data=value, parent=item)
window = QWidget()
layout = QVBoxLayout()
window.setLayout(layout)
treewidget = QTreeWidget()
build_tree(data=data, parent=treewidget)
layout.addWidget(treewidget)
window.show()
如果您只想將列表轉換為 dict 以便在 treewidget 中使用它,您可以嘗試以下操作:
data = ['deadpool','deadpool/Backup','deadpool/Photos','deadpool/Photos/Foobar']
tree = {}
for path in data: # for each path
node = tree # start from the very top
for level in path.split('/'): # split the path into a list
if level: # if a name is non-empty
node = node.setdefault(level, dict())
# move to the deeper level
# (or create it if unexistent)
print(tree)
上面的代碼來自這個主題: Stackoverflow
現在你有一個 dict 可以與第一個代碼塊一起使用!
我希望它會幫助你!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.