1

我正在尝试从字典中的某个点拆分字典。似乎做一个简单的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

我只知道如何通过以某个字符串开头的键对字典进行切片,但我只想知道如何对类似于列表的字典进行切片。

4

6 回答 6

4

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

于 2013-05-20T02:49:32.247 回答
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}
于 2013-05-20T02:52:11.013 回答
2

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

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

于 2013-05-20T03:06:15.930 回答
1
items = [
    ("Cannon barrels",10),
    ("Cannon furnace",12),
    ("Candle",36),
    ....
   ]

items_dict = dict(items)

items_3_dict = dict(items[3:])

没有完全回答您的问题(请参阅@mgilson 答案),但提供了前进的道路

于 2013-05-20T02:51:51.110 回答
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))

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

于 2013-05-20T03:02:50.567 回答
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)

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

>>> 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
于 2013-05-28T09:42:22.240 回答