我目前有一个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中解决这个问题?
答案 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"}
中元素的顺序不固定,因此订单可能会有所不同。