在python中,一个列表像树拓扑一样转换为dict

在python中,一个列表像树拓扑一样转换为dict,python,python-2.7,Python,Python 2.7,在python2.7中,我有一个列表 ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q'] 我需要转换成一个像dict一样的 { 'A':['B','C'], 'B':['D','E'], 'C':['F','G'], 'D':['H','I'], 'E':['J','K'], 'F':['L','M'], 'G':['N','O'], 'H':['P','Q'], 'I':[], 'J':[], 'K':[

在python2.7中,我有一个列表

['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q']
我需要转换成一个像dict一样的

{
'A':['B','C'],
'B':['D','E'],
'C':['F','G'],
'D':['H','I'],
'E':['J','K'],
'F':['L','M'],
'G':['N','O'],
'H':['P','Q'],
'I':[],
'J':[],
'K':[],
'L':[],
'M':[],
'N':[],
'O':[],
'P':[],
'Q':[]
}
使用
zip()
itertools.izip\u longest()
您可以像这样做:

代码: 结果:
您可以使用
itertools

from itertools import chain, repeat

data = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q']
lists = [[first, second] for first, second in zip(data[1::2], data[2::2])]
result = {char: list(value) for char, value in zip(data, chain(lists, repeat([])))}

result
输出:

{'A': ['B', 'C'],
 'B': ['D', 'E'],
 'C': ['F', 'G'],
 'D': ['H', 'I'],
 'E': ['J', 'K'],
 'F': ['L', 'M'],
 'G': ['N', 'O'],
 'H': ['P', 'Q'],
 'I': [],
 'J': [],
 'K': [],
 'L': [],
 'M': [],
 'N': [],
 'O': [],
 'P': [],
 'Q': []}

您可以按索引关系创建树拓扑dict:

def generateTree(arr):
    tree = {}
    for i, v in enumerate(arr):
        tree[v] = []
        if i * 2 + 1 < len(arr):
            tree[v].append(arr[i * 2 + 1])
        if i * 2 + 2 < len(arr):
            tree[v].append(arr[i * 2 + 2])
    return tree
def generateTree(arr):
树={}
对于枚举(arr)中的i、v:
树[v]=[]
如果i*2+1
输出:
{'A':['B','C'],'B':['D','E'],'C':['F','G'],'D':['H','I'],'E':['J','K'],'F':['L','M'],'G':['N','O'],'H':['P','Q'],'I':[],'J':[],'J':[],'K':[],'L':[],'M':[],'N':[],'N':[],'O','P':[],'Q:[]>


希望这将对您有所帮助,如果您还有其他问题,请发表评论。:)

这里有一个非常优化的老式方法,它使用了以下教程中描述的数组索引方法:

第一行用子元素的值填充非叶子。第二行填充要为空的叶子列表。我将注意到,我们知道内部节点的数量是(len(values)//2)

alphabet=['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q']
d={}#空字典
计数器=2
对于范围(0,len(字母表))中的i:
如果i==0:#仅在字母“A”处
lst=[字母表[i+1],字母表[i+2]]#lst将用作字典中键的值
elif i试试这个:

LL = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q']

dd = {}
for i,e in enumerate(LL):
    LLL   = []
    if ((i+1) + len(dd) < len(LL)): LLL = [LL[((i+1) + len(dd))], LL[((i+1) + len(dd))+1]]
    dd[e] = LLL

print dd

{'A': ['B', 'C'], 
'B': ['D', 'E'], 
'C': ['F', 'G'], 
'D': ['H', 'I'], 
'E': ['J', 'K'], 
'F': ['L', 'M'], 
'G': ['N', 'O'], 
'H': ['P', 'Q'], 
'I': [], 
'J': [], 
'K': [], 
'L': [], 
'M': [], 
'N': [], 
'O': [], 
'P': [], 
'Q': []}
LL=['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q']
dd={}
对于枚举中的i,e(LL):
LLL=[]
如果((i+1)+len(dd)
更具可读性:

dd = {}   
for i,e in enumerate(LL):
        LLL   = []
        intv  = (i+1) + len(dd)           
        if (intv < len(LL)): LLL = [LL[(intv)], LL[(intv)+1]]
        dd[e] = LLL

print dd
dd={}
对于枚举中的i,e(LL):
LLL=[]
intv=(i+1)+len(dd)
如果(intv
values = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q']
dictionary = {values[i]:[values[2*i+1], values[2*i+2]] for i in range((len(values) // 2))}
dictionary.update({values[i]:[] for i in range((len(values) // 2) + 1, len(values))})
alphabet=['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q']

d={} # empty dictionary
counter=2
for i in range(0,len(alphabet)):
    if i==0: # at letter 'A' only
        lst=[alphabet[i+1],alphabet[i+2]] # lst that will be used as value of key in dictionary
    elif i<(len(alphabet)-1)/2: #  at letter 'B' through 'H'
        lst=[alphabet[i+counter],alphabet[i+counter+1]] # lst that will be used as value of key in dictionary
        counter+=1 # increment counter

    else: # all letters after 'H'
        lst=[] # an empty list that will be used as value of key in dictionary
    d[alphabet[i]]=lst # add 'lst' as a value for the letter key in the dictionary

print(d) # print the dictionary

# {'A': ['B', 'C'], 'B': ['D', 'E'], 'C': ['F', 'G'], 'D': ['H', 'I'], 'E': ['J', 'K'], 'F': ['L', 'M'], 'G': ['N', 'O'], 'H': ['P', 'Q'], 'I': [], 'J': [], 'K': [], 'L': [], 'M': [], 'N': [], 'O': [], 'P': [], 'Q': []}




LL = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q']

dd = {}
for i,e in enumerate(LL):
    LLL   = []
    if ((i+1) + len(dd) < len(LL)): LLL = [LL[((i+1) + len(dd))], LL[((i+1) + len(dd))+1]]
    dd[e] = LLL

print dd

{'A': ['B', 'C'], 
'B': ['D', 'E'], 
'C': ['F', 'G'], 
'D': ['H', 'I'], 
'E': ['J', 'K'], 
'F': ['L', 'M'], 
'G': ['N', 'O'], 
'H': ['P', 'Q'], 
'I': [], 
'J': [], 
'K': [], 
'L': [], 
'M': [], 
'N': [], 
'O': [], 
'P': [], 
'Q': []}
dd = {}   
for i,e in enumerate(LL):
        LLL   = []
        intv  = (i+1) + len(dd)           
        if (intv < len(LL)): LLL = [LL[(intv)], LL[(intv)+1]]
        dd[e] = LLL

print dd