从某个键拆分python dict

时间:2013-05-20 02:49:02

标签: python dictionary slice

我试图从字典中的某个点分割出一个字典。似乎做一个简单的items_dict[3:]会起作用,但它不起作用。

items_dict = {
    "Cannon barrels":10,
    "Cannon furnace":12,
    "Candle":36,
    "Bronze arrowheads":39,
    "Iron arrowheads":40,
    "Steel arrowheads":41,
    "Mithril arrowheads":42,
    "Adamant arrowheads":4
}
print items_dict[3:] # Nope, this won't work
print items_dict["Candle"] # This will of course, but only returns the Candle's number

我只知道如何to slice a dictionary by keys that start with a certain string,但我只是想知道如何切割类似于列表的字典。

6 个答案:

答案 0 :(得分:4)

词典没有顺序,因此您无法从某个点拆分它。看看你在那里的字典,你不能提前知道第一个元素是什么。

答案 1 :(得分:2)

如果你想在n个键之后拆分 - 不保证订单。

n=3
d1 = {key: value for i, (key, value) in enumerate(d.items()) if i < n}
d2 = {key: value for i, (key, value) in enumerate(d.items()) if i >= n}

答案 2 :(得分:2)

如果您想要按顺序存储密钥的字典,请使用collections.OrderedDict

http://docs.python.org/2/library/collections.html#collections.OrderedDict

答案 3 :(得分:1)

items = [
    ("Cannon barrels",10),
    ("Cannon furnace",12),
    ("Candle",36),
    ....
   ]

items_dict = dict(items)

items_3_dict = dict(items[3:])

并没有完全回答你的问题(参见@mgilson回答),但提供了一条前进的道路

答案 4 :(得分:1)

ditems = items_dict.items()
d1, d2 = dict(ditems[:3]), dict(ditems[3:])

print(d1)
print(d2)
{'Iron arrowheads': 40, 'Adamant arrowheads': 4, 'Mithril arrowheads': 42}
{'Candle': 36, 'Cannon barrels': 10, 'Steel arrowheads': 41, 'Cannon furnace': 12, 'Bronze arrowheads': 39}

或创建一个函数来分割关于n - 值

的迭代
from itertools import islice

def split(iterable,point): 
    return islice(iterable,None,point), islice(iterable,point,None)

d1, d2 = (dict(segment) for segment in split(items_dict.items(),3))

这将拆分关于第三个条目。

答案 5 :(得分:0)

您可以创建自定义类(仅限示例 - 切片仅适用于[1:4]语法,而dict[missing_key]返回None而不是抛出异常):

>>> class SliceDict(collections.OrderedDict):
...     def __getitem__(self, val):
...         if isinstance(val, slice):
...             return {key: value for i, (key, value) in enumerate(d.items()) if val.start < i < val.stop}
...         else:
...             return self.get(val)

现在我们可以添加您的项目dict:

>>> d = SliceDict(items_dict)
SliceDict([('Adamant arrowheads', 4), ('Mithril arrowheads', 42), ('Iron arrowheads', 40), ('Candle', 36), ('Cannon barrels', 10), ('Steel arrowheads', 41), ('Cannon furnace', 12), ('Bronze arrowheads', 39)])
>>> d[1:5]
{'Candle': 36, 'Cannon barrels': 10, 'Iron arrowheads': 40}
>>> d['Candle']
36