2014-01-21 23 views
0

目前,我有,我想创建键和值的最终总榜单的字典创建值总榜单:如何从字典

adict = {'f': {'g', 'd'}, 
     'd': {'g'}, 
     'e': {'d'}, 
     'b': {'d'}, 
     'c': {'f', 'e'}, 
     'a': {'b', 'c'}} 

目前我在这个寻找功能格式:

def create_final_total_list(thedictionary: dict(), startingkey:str): 
    final_list = [] 
    # function here 

我想要的是让用户输入一个开始键,它将键和它的值附加到final_list。而且这些值也会成为键值,这些键值也会将其所有值添加到final_list中等等。如果启动键将是“一”,那么它首先确实

实施例:

final_list = ['a', 'b', 'c'] 

然后,它会看到“b”和“c”的值,并从字典添加它们的值,从而它将成为:

final_list = ['a', 'b', 'c', 
       'b', 'd', 
       'c', 'f', 'e', ...] 

而且从价值观 'd', 'f' 和 'E' 它会成为:

final_list = ['a', 'b', 'c', 

       'b', 'd', 
       'c', 'f', 'e' 

       'd', 'g' 
       'f', 'g', 'd' 
       'e', 'd' ...] 

等等...

它有点像达到功能,从一个键和从其值到达下一个。

我将如何在Python 3.3中解决这个问题?

+0

我正确的假设输入字典通过其相邻节点定义了一些定向图吗? – bereal

+0

这是拓扑排序,我想。 –

+0

@bereal你的假设是正确的。 – user2559679

回答

1

如何如下:

使用deque为您的队列:

>>> from topsort import adict, create_final_total_list 
>>> adict 
{'a': {'b', 'c'}, 'b': {'d'}, 'c': {'e', 'f'}, 'd': {'g'}, 'e': {'d'}, 'f': {'d', 'g'}} 
>>> create_final_total_list(adict, 'c') 
['c', 'e', 'f', 'f', 'd', 'g', 'g', 'd', 'g', 'g', 'e', 'd', 'd', 'g', 'g'] 

该函数的代码:

def create_final_total_list(the_dict, startingkey): 
    final_list = [] 
    var = deque([startingkey]) 
    while var: 
     u = var.pop() 
     final_list.append(u) 
     s = the_dict[u] if u in the_dict else None 
     if s: 
      final_list.extend(s) 
      var.extend(s) 

    return final_list 
0

我修改你的第一部字典,使其包含的字典的列表(其他语法不正确),那么我只是通过最终列表作为输出参数:

>>> adict = {'f': ['g', 'd'], 
     'd': ['g'], 
     'e': ['d'], 
     'b': ['d'], 
     'c': ['f', 'e'], 
     'a': ['b', 'c']} 
>>> def create_final_total_list(thedictionary, startingkey, final_list): 
    final_list.append(startingkey) 
    final_list.extend(thedictionary[startingkey]) 


>>> fl = [] 
>>> create_final_total_list(adict, 'a', fl) 
>>> fl 
['a', 'b', 'c'] 
>>> create_final_total_list(adict, 'b', fl) 
>>> create_final_total_list(adict, 'c', fl) 
>>> fl 
['a', 'b', 'c', 'b', 'd', 'c', 'f', 'e'] 
>>> 
+0

'{'g','d'}'是有效的语法并定义了一个'set' –

+0

哦,对了,谢谢你指出这个! – Emmanuel

0

我看到一个发布的答案,所以我会以任何方式发布我的。我的队列执行是简单的列表,虽然不知道是否会有使用队列或dqueue任何好处

实施

def create_final_total_list(thedictionary, key): 
    final_list = list(thedictionary[key]) 
    Q = list(thedictionary[key]) 
    while Q: 
     key = Q.pop(0) 
     final_list+=thedictionary.get(key, []) 
     Q+=thedictionary.get(key, []) 
    return final_list 

输出

>>> create_final_total_list(adict, 'a') 
['c', 'b', 'e', 'f', 'd', 'd', 'd', 'g', 'g', 'g', 'g'] 
0

的递归实现可能是:

from itertools import chain 

adict = {'f': {'g', 'd'}, 
     'd': {'g'}, 
     'e': {'d'}, 
     'b': {'d'}, 
     'c': {'f', 'e'}, 
     'a': {'b', 'c'}} 

def create_final_list(dict_, key): 
    values = list(dict_.get(key, [])) 
    return [key] + values + \ 
     list(chain(*[create_final_list(dict_, v) for v in values])) 

print create_final_list(adict, "a") 

此打印:

['a', 'c', 'b', 'c', 'e', 'f', 'e', 'd', 'd', 'g', 'g', 'f', 'd', 'g', 'd', 'g', 'g', 'g', 'b', 'd', 'd', 'g', 'g'] 

请注意,元件的一组{"a","b"}的顺序不是固定的,从而顺序可以变化。