for循环迭代元组

时间:2015-05-13 20:56:48

标签: python for-loop dictionary tuples

我是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小时后试图解决它... 谢谢

2 个答案:

答案 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现在包含密钥,pretpasttrad列表中与密钥对应的每个元素。

答案 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