【问题标题】:unpack to int and string in python在python中解压为int和string
【发布时间】:2020-11-18 13:22:03
【问题描述】:

有没有办法解包到不同的类型?是这样的:

# data = [4, "lorem", "ipsum", "dolor", "sit", "amet"]
(parts, *words) = data

data 已提供。我从不分配这个值。我作为例子添加。 parts 必须是 int,列表的所有其余部分都分配为字符串列表。

我发现的唯一方法是将变量 parts 重新分配为下一个:

(parts, *words) = [4, "lorem", "ipsum", "dolor", "sit", "amet"]
parts = int(parts)

但我不喜欢连续两次重复赋值变量。由于 python 是一种保持简洁的语言,我正在寻找解决方案。

*编辑: 让我知道连续两次重新分配是否有效。

【问题讨论】:

  • 在列表中 - data ,如果第一个元素(数字)是 int。然后变量parts 将是int,您不需要将其更改为类型“int”。您能否提供更多有关您期望的信息?
  • 不一定,源可能正在读取一个文件并且是一个字符串列表,其中第一个字符串是一个数字。

标签: python variable-assignment iterable-unpacking shorthand python-typing


【解决方案1】:

在 Python 的静态类型注解中,lists(以及除tuples 之外的所有序列)被假定为同构类型(可能仍然是多种类型的联合,但它不是不同的单一类型,具体取决于您正在查看哪个索引)。您的 list 违反了该假设,因为索引 0 具有一种类型,而其他索引具有不同的类型。尽管 Python 通常不会强制执行 list 的“预期”用法,但类型检查器会执行,并且没有机制可以解决手动转换或类型转换的问题,就像您在此处所做的那样。

简答:你在“滥用”lists,而 typing 在你这样做时不会帮助你。所以要么忽略/禁用此代码的类型检查器(毕竟它会工作得很好),或者与毫无意义的演员一起生活。

【讨论】:

  • 假设它是一个同质的字符串列表,第一个元素将是一个编码为字符串的数字。我认为这不会违反清单原则。 “数据”来自未知来源,例如标准输入。
  • @iLevi:是的,但在这种情况下,解析为int 是必要的,而不是满足类型检查器的可选附加组件。如果问题是“我可以单行解包和转换吗?”答案是“没有以任何干净的方式利用您尝试这样做的方式解包”。你总是可以像parts, words = int(data.pop(0)), dataparts, words = int(data[0]), data[1:] 那样做垃圾,但你在某处重复自己,这比你想出的两行更丑/更令人困惑。
  • 您的回答在我看来是合理有效的。我会看看是否有其他评论,如果没有其他意见,我会将其标记为回复。谢谢你,我的朋友。
【解决方案2】:

这个怎么样?它测试每个项目的类型并根据需要将其放入适当的列表中。

data = [4, "lorem", "ipsum", "dolor", "sit", "amet"]
parts = []
words = []
[parts.append(item) if type(item) == int else words.append(item) for item in data]

【讨论】:

    猜你喜欢
    • 2015-06-24
    • 1970-01-01
    • 2012-06-24
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多