从Python的dict dict中的元组

时间:2014-01-08 17:59:20

标签: python dictionary

我在python中有一个dict的词典,用于从dict中获取随机值

words = {0:{"wake up": "aaaa"},
         1:{"look after": "bbbb"},
         2:{"turn on": "cccc"}
        }

我想从字典词

中提取第二个字典(数字键的值)
(k, v) = words[random.randint(0, 22)]

但错误是这个

ValueError: need more than 1 value to unpack

为什么我需要其他价值观?

2 个答案:

答案 0 :(得分:3)

您正在使用密钥访问字典,该密钥返回 值:

value = words[random.randint(0, 22)]

但如果您的密钥都是整数,那么最好使用列表:

words = [{"wake up": "aaaa"}, {"look after": "bbbb"}, {"turn on": "cccc"}]
value = random.choice(words)

random.choice()尽一切努力随意挑选一个。

当然,您仍然可以将random.choice()与字典值一起使用:

value = random.choice(list(words.values()))

会从字典中返回一个随机值,并且:

key, value = random.choice(list(words.items()))

将为您返回一个随机(key, value)对。

如果您打算将存储的词典提取到键和值中,则必须从该对象中提取一个键值对;你不能在字典上使用元组解包:

>>> key, value = {'foo': 'bar'}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: need more than 1 value to unpack

但这有效:

>>> key, value = next(iter({'foo': 'bar'}.items()))
>>> key, value
('foo', 'bar')

但是,如果您想提取随机键值对,或者将键和值直接存储在words字典中,也许您应该存储元组而不是字典。

答案 1 :(得分:0)

摘要:方法3是最诡计多端的方式。

  1. 如果不对数据结构进行任何修改,以下代码将适用于您:

    k, v = words[random.randint(0, 2)].items()[0]
    

    但是,这不是最好的(和pythonic)方式。

  2. 如果你的内部字典总是有一个键值对,那么就没有必要把它作为一个字典。相反,将内部数据保留为元组。

    words = {0: ("wake up", "aaaa"),
        1:("look after", "bbbb"),
        2:("turn on", "cccc")
    }
    
    # Now, the following line should work fine
    k, v = words[random.randint(0, 2)]
    
  3. 如果对外部数据结构没有限制,那么使用list或tuple如下:

    words = (
        ("wake up", "aaaa"),
        ("look after", "bbbb"),
        ("turn on", "cccc")
    )
    
    # Now, the random.choice can be used
    k, v = random.choice(words)