我是Python的初学者(20年后又回到编码......)
我正在做一个小脚本,以学习不规则的英语动词。 我创建了我的dict,看起来像这样(用法语)
verbes = {
"abide":["abode","abode","respecter / se conformer à"],
"arise":["arisen","arisen","survenir"],
}
如果我想迭代我正在做的那些动词,例如:
for verb, (pret, past, trad) in verbes.items():
print "Le verbe %s se conjugue au prétérit par %s, au participe passé par %s et se traduit par %s" % (verb, pret, past, trad)
好的,有效。 然后我发现我可以随机导入以获取一个随机键和我的词典中的值
rand = random.choice(verbes.items())
如果我打印兰特,我有一把钥匙,价值 但如果我再次迭代我有一个追溯:
Traceback (most recent call last):
File ".\exverbe1.py", line 209, in <module>
for verb, (pret, past, trad) in rand.items(): AttributeError: 'tuple' object has no attribute 'items'
我还没上过“元组”课,但我试图把它变成一个列表,一个字典等,但没有成功。我在stackoverflow中查看了“for loop tuple”而没有结果。所以现在我要求帮助3小时后试图解决它... 谢谢
答案 0 :(得分:2)
random.choice(verbes.items())
从verbes.items()
随机选择一个元组。因此,rand
包含一个项目 - rand[0]
包含密钥,rand[1]
包含值。
如果你要做的是遍历值列表中的项目:
for val in rand[1]:
print val
将rand
元组解包为其成分:
verb, (pret, past, trad)
verb
现在包含密钥,pret
,past
和trad
列表中与密钥对应的每个元素。
答案 1 :(得分:1)
rand
是来自verbes
的商品,因此无需再次调用商品:
rand = random.choice(verbes.items())
verb, (pret, past, trad) = rand
dict.items()
返回dict中“items”的列表。每个项目都是(key, value)
形式的元组。 random.choice
返回其中一个元组。我看到你试图循环rand
,也许你想要一个以上的随机项目?如果是这样,你可以做类似的事情:
for i in range(N):
verb, (pret, past, trad) = random.choice(verbes.items())
# Do more stuff
更新
在python中,他们调用诸如a, b = iterable
解包之类的asigment。您可以在右侧使用许多不同类型,例如:
# A tuple
a, b = ("A", "B")
# A list
a, b = ["A", "B"]
# A string
a, b = "AB"
在简单的情况下,数字或变量需要与iterable或python中的项目数相同才会引发错误。您可以嵌套解压缩:
a, (b, c, d) = ("A", "BCD")
# is the same as
a, temp = ("A", "BCD")
(b, c, d) = temp
外部的()
是可选的,因此a, b = item
与(a, b) = item
相同。
Python 3引入了我从未使用的更高级的解包类型,但您可以阅读它们here。