Dict与花括号和OrderedDict

时间:2017-12-05 17:49:30

标签: python python-3.x dictionary ordereddictionary

我以为我为自己制定了一个简单的项目,但我猜不是。我认为我使用Ordered dict函数的时间很长,因为我一直在使用:

 ValueError: too many values to unpack (expected 2)

代码:

import random
import _collections

shop = {
    'bread': 2,
    'chips': 4,
    'tacos': 5,
    'tuna': 4,
    'bacon': 8,
}

print(shop)

'''
items = list(shop.keys())
random.shuffle(items)
_collections.OrderedDict(items)
'''

n = random.randrange(0, len(shop.keys()))
m = random.randrange(n, len(shop.keys()))

if m <= n:
    m += 1

print(n, " ", m)


for key in shop.keys():
    value = shop[key] * random.uniform(0.7,2.3)
    print(key, "=", int(value))
    if n < m:
        n += 1
    else:
        break

我想让这段代码混淆字典,然后将这些值乘以0.7 - 2.3。然后在0-5次范围内循环,以便从字典中给我几个随机密钥。

我已经放置了&#39;&#39;&#39; &#39;&#39;&#39;在我挣扎的代码上,给了我错误。

2 个答案:

答案 0 :(得分:3)

你非常接近,但你不能只提供新OrderedDict的密钥列表,你也必须给出值...试试这个:

import random
import collections

shop = {
    'bread': 2,
    'chips': 4,
    'tacos': 5,
    'tuna': 4,
    'bacon': 8,
}

print(shop)

items = list(shop.keys())
random.shuffle(items)

print(items)

ordered_shop = collections.OrderedDict()
for item in items:
    ordered_shop[item] = shop[item]

print(ordered_shop)

示例输出:

{'chips': 4, 'tuna': 4, 'bread': 2, 'bacon': 8, 'tacos': 5}
['bacon', 'chips', 'bread', 'tuna', 'tacos']
OrderedDict([('bacon', 8), ('chips', 4), ('bread', 2), ('tuna', 4), ('tacos', 5)])

您也可以这样做(正如@ShadowRanger所指出的那样):

items = list(shop.items())
random.shuffle(items)
oshop = collections.OrderedDict(items)

这是有效的,因为OrderedDict构造函数采用键值元组列表。经过反思,这可能就是您采用初始方法时的情况 - 将keys()换成items()

答案 1 :(得分:1)

d = collections.OrderedDict.fromkeys(items)

然后根据需要使用新创建的词典d