具有多个输入集的理解

Ale*_*ell 5 python dictionary list-comprehension list dictionary-comprehension

我正在尝试使用python,并试图在我正在做的事情的背景下理解错误消息.

我正在玩弄理解并试图找到一个模式来创建一个包含多个输入集的列表/字典理解(假设这是可能的):

注意:这里单词输入集表示理解的输入区域.在setbuilder表示法中,python派生出它的理解[在LIST中为Y表示Y],Y是输出函数,X是变量,LIST是输入集.

假设我有以下工作代码:

from random import randint

mydict = {k: 0 for k in range(10)}
result = {randint(0,9): v + 1 for v in mydict.values()}
Run Code Online (Sandbox Code Playgroud)

我不是想对它做任何特别的事情.这甚至不是有用的代码,因为它不会按预期工作.字典中的所有元素都将具有值1,而不是随机生成器指向的那些元素.我唯一的目标是有一个基础,从我开始尝试使用输入集的元组.

from random import randint

mydict = {k: 0 for k in range(10)}
result = {k: v + 1 for k, v in (randint(0,9), mydict.values())}
Run Code Online (Sandbox Code Playgroud)

这个选项让我:TypeError: 'int' object is not iterable.

通过交换输入集和解压缩,我有:

result = {k: v + 1 for *v, k in (mydict.values(), randint(0,9))}
Run Code Online (Sandbox Code Playgroud)

但是这个选项让我: TypeError: can only concatenate list (not "int") to list

这些错误是否出现是因为我试图做一些语言语法不理解的事情,或者我错过了什么,我实际上可以修复代码?

mu *_*u 無 7

你必须为随机数创建一个单独的理解,因为它目前只有一个随机数.此外,您需要压缩结果以获得组合实体:

>>> from random import randint
>>> mydict = {k: 0 for k in range(10)}
>>> result = {k: v + 1 for k, v in zip([randint(0,9) for _ in range(10)] , mydict.values())}
>>> result
{2: 1, 3: 1, 4: 1, 5: 1, 8: 1, 9: 1}
Run Code Online (Sandbox Code Playgroud)

请注意,由于您的初始dict具有其0所有键的值,因此结果dict中的所有值都是1(0+1).

此外,由于我们正在使密钥随机,可能存在重叠(比如2生成两次),这就是为什么我们没有看到result字典中的所有密钥.

正如@wim在下面的评论中指出的,生成此结果字典的更好方法是使用:

>>> {randint(0,9): v+1 for v in mydict.values()}
{0: 1, 1: 1, 2: 1, 3: 1, 6: 1, 7: 1}
Run Code Online (Sandbox Code Playgroud)

  • 这是一种奇怪的方式.您也可以将randint(0,9)作为k并且仅包括理解中的v. (2认同)