【问题标题】:Comprehensions with multiple input sets对多个输入集的理解
【发布时间】:2015-06-26 15:12:59
【问题描述】:

我正在试验 python,并且一直试图理解我正在做的上下文中的错误消息。

我正在玩转推导并试图找到一种模式来创建具有多个输入集的列表/字典推导(假设这是可能的):

注意:这里的词输入集表示理解的输入区域。在 setbuilder 表示法中,python 从中推导出其推导 [Y for X in LIST],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()}

我并不想对此做任何特别的事情。这甚至不是有用的代码,因为它不会按预期工作。字典中的所有元素都将具有值 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())}

这个选项给了我:TypeError: 'int' object is not iterable

通过交换输入集并解包我有:

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

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

出现这些错误是因为我正在尝试做一些语言语法无法理解的事情,还是我遗漏了一些东西而实际上我可以修复代码?

【问题讨论】:

  • 不清楚您期望的输出。说randint(0,9)返回3;你想要什么result
  • 你想要一个包含来自range(10) 的键和来自randint 的随机值的字典吗?
  • 你们专注于代码意图。这里唯一的目的是看看是否有办法在理解中包含输入集的元组。代码只是我实验的基础。
  • —1 直到您提供示例输出
  • @AlexandreBell:我们可以想出六种方法来“在理解中包含一组输入集”(尽管因为您的问题中根本没有集合,而在回答您接受,我不确定您是否知道set 在 Python 中的含义)。它们中的大多数都与您感兴趣的任何事情无关,这就是为什么我们不知道如何“修复代码”而不知道它应该首先做什么。作为一款游戏,我们当然可以猜出最像你想象中的东西。

标签: python list dictionary list-comprehension dictionary-comprehension


【解决方案1】:

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

>>> 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}

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

此外,由于我们使键随机化,因此可能存在重叠(比如2 生成了两次),这就是为什么我们在result 字典中看不到所有键的原因。

正如下面 cmets 中的 @wim 所述,生成此结果字典的更好方法是使用:

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

【讨论】:

  • 这是一种奇怪的处理方式。您也可以将 randint(0, 9) 作为 k 并仅将 v 包含在理解中。
  • @wim 没错,我专注于告诉 OP 当前代码有什么问题...
  • 太棒了,穆!感谢您帮助我找到错误的地方。 @wim,这只是一个实验。真正的意图是尝试找到一种方法来拥有一组输入集
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-07
  • 2021-08-10
  • 1970-01-01
  • 2023-01-19
  • 1970-01-01
  • 2011-05-26
  • 2023-01-25
相关资源
最近更新 更多