我正在尽全力解决这个问题,但是不够灵活。
在我的Python脚本中,我有一个字典列表字典。(实际上,它会更深入一点,但该级别不涉及此问题。)我想将所有这些内容整理成一个很长的列表,扔掉所有的字典键。
因此我想转型
{1: {'a': [1, 2, 3], 'b': [0]},
2: {'c': [4, 5, 1], 'd': [3, 8]}}
至
[1, 2, 3, 0, 4, 5, 1, 3, 8]
我可能可以设置一个map-reduce来迭代外部词典的各项,以从每个子词典构建一个子列表,然后将所有子列表连接在一起。
但这对于大型数据集似乎效率不高,因为中间的数据结构(子列表)将被丢弃。有一种方法可以一次完成吗?
除非如此,否则我很乐意接受一个有效的两级实现…我的map-reduce生锈了!
更新: 对于那些感兴趣的人,下面是我最终使用的代码。
注意,尽管我在上面要求一个列表作为输出,但我真正需要的是一个有序列表。即,展平的输出可以是可以排序的任何可迭代的。
def genSessions(d):
"""Given the ipDict, return an iterator that provides all the sessions,
one by one, converted to tuples."""
for uaDict in d.itervalues():
for sessions in uaDict.itervalues():
for session in sessions:
yield tuple(session)
…
# Flatten dict of dicts of lists of sessions into a list of sessions.
# Sort that list by start time
sessionsByStartTime = sorted(genSessions(ipDict), key=operator.itemgetter(0))
# Then make another copy sorted by end time.
sessionsByEndTime = sorted(sessionsByStartTime, key=operator.itemgetter(1))
再次感谢所有提供帮助的人。
[更新:替换nthGetter()
用operator.itemgetter()
,感谢@intuited]
编辑 :重新阅读原始问题和重新设计的答案,以假定所有非词典都是要拼合的列表。
如果您不确定字典的使用范围,可以使用递归函数。@Arrieta已经发布了一个函数,该函数以递归方式构建非字典值列表。
这是一个生成器,它在字典树中产生连续的非字典值:
def flatten(d):
"""Recursively flatten dictionary values in `d`.
>>> hat = {'cat': ['images/cat-in-the-hat.png'],
... 'fish': {'colours': {'red': [0xFF0000], 'blue': [0x0000FF]},
... 'numbers': {'one': [1], 'two': [2]}},
... 'food': {'eggs': {'green': [0x00FF00]},
... 'ham': ['lean', 'medium', 'fat']}}
>>> set_of_values = set(flatten(hat))
>>> sorted(set_of_values)
[1, 2, 255, 65280, 16711680, 'fat', 'images/cat-in-the-hat.png', 'lean', 'medium']
"""
try:
for v in d.itervalues():
for nested_v in flatten(v):
yield nested_v
except AttributeError:
for list_v in d:
yield list_v
doctest将结果迭代器传递给set
函数。这很可能就是您想要的,因为正如Martelli先生所指出的那样,字典值没有内在顺序,因此没有理由跟踪它们的查找顺序。
您可能需要跟踪每个值的出现次数;如果将迭代器传递给,则此信息将丢失set
。如果您想跟踪它,只需将的结果传递flatten(hat)
给其他函数而不是即可set
。在Python
2.7下,该其他函数可以是collections.Counter
。为了与发展程度较低的python兼容,您可以编写自己的函数,或者(在效率方面有所损失)sorted
与结合使用itertools.groupby
。
问题内容: 给定一个像这样的字典: 如何创建一个字典列表,该列表结合了第一个字典键的各种值?我想要的是: 问题答案: 我认为您想要笛卡尔积,而不是排列,在这种情况下可以提供帮助:
问题内容: 我正在尝试拼合嵌套的字典: 我想显示列表中的所有值:[4、6、3、23、3、45、2、0、6、1、2、3,…,2、10、8] 我的第一个想法是这样做: 虽然我得到了错误。我很乐意提供处理技巧。 问题答案: 您可以如下使用简单的递归函数。
问题内容: 带有字典列表,例如: 将它们组合到以下词典列表中的最佳方法是什么: 还是最好以其他方式存储数据,例如: 谢谢你的帮助。 问题答案: 这是一个可能的解决方案: 产生: 如您所见,我使用字典(“合并”)作为中途点。当然,您可以通过以不同的方式存储数据来跳过步骤,但这还取决于这些变量可能具有的其他用途。 祝一切顺利。
拼写检查 1选择 “编辑 ”>“拼写检查 ”。 2若要设置用于单词的查找和忽略的选项,请单击对话框底部的箭头图标,并根据需要设置选项。 3单击 “开始 ”,即可开始进行拼写检查。 4当 Illustrator 显示出拼写错误的单词或其他可能的错误时,请执行下列操作之一: 单击 “忽略 ”或 “全部忽略 ”继续拼写检查,而不更改特定的单词。 从建议单词列表中选择一个单词,或在顶部的框中键入正确的单词
问题内容: 我该如何列出这样的词典列表。 …变成这样的单个字典: 问题答案: 这适用于任何长度的字典: 作为一个理解:
耶稣对他说:“你要尽心、尽性、尽意,爱主你的神。这是诫命中的第一,且是最大的。其次也相仿,就是要爱人如己。这两条诫命是律法和先知一切道理的总纲。”(MATTHEW 22:37-39) 字典(2) 字典方法 跟前面所讲述的其它对象类似,字典也有一些方法。通过这些方法,能够实现对字典的操作。 这回可不是屠龙之技了,这些方法在编程实践中经常会用到。 copy 拷贝,这个汉语是copy的音译,标准的汉语翻