如何从字典中创建值的总列表

时间:2014-01-21 08:58:11

标签: python list dictionary

我目前有一个dict,我想创建一个最终的键和值列表:

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等等。

示例如果启动键是'a',那么它首先执行:

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

然后它会看到'b'和'c'值并从dict中添加它们的值,所以它会变成:

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中解决这个问题?

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我修改了你的第一个字典,以便它包含一个列表的字典(否则语法不正确),然后我将你的最终列表作为out参数传递:

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

答案 2 :(得分:0)

我看到一个已发布的答案,所以我会以任何方式发布我的。我的队列实现是简单列表,但不确定使用队列或队列是否有任何好处

<强>实施

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

答案 3 :(得分: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"}中元素的顺序不固定,因此订单可能会有所不同。