python - 如何动态地将变量转换为另一种类型?
问题描述
假设在 Python 中我有两个不同类型的变量:
A = [1, 2, 3]
B = 4
我想添加B
到A
. 我可以通过放入B
一个列表,然后使用+
运算符来做到这一点。
A + [B]
但是,这仅适用于列表。我想要一个更通用的解决方案,所以我可以编写一个函数,比如说,concat
它需要两件事并尝试将它们放在一起。我们可以假设 的类型A
将是某种类型的集合(字符串、列表、集合等)。
我试过这个:
typeA = type(A)
A + typeA(B)
但这会导致错误'int' is not iterable
,因为它相当于做list(B)
. 但是,它适用于字符串和整数:
A = "Hello"
B = 9
typeA = type(A)
A + typeA(B)
我想避免使用一堆if/else
来匹配我可能遇到的每种可能的类型组合。有没有这样做的“Pythonic”方式?
解决方案
您将需要某种条件,但您可以将其包装在一个singleton
函数中。这个函数将把它的不可迭代参数包装在一个迭代器(特别是 a generator
)中,并按原样返回它的可迭代参数。(注意: astr
是可迭代的,所以singleton("foo")
会返回"foo"
,而不是一个只产生的新迭代"foo"
。)
def singleton(x):
try:
iter(x)
except ValueError:
return (y for y in (x,))
else:
return x
然后你可以itertools.chain
用来连接两个迭代。
>>> from itertools import chain
>>> list(chain([1,2,3], singleton(4)))
[1, 2, 3, 4]
>>> list(chain([1,2,3], singleton((5,6))))
[1, 2, 3, 4, 5, 6]
>>> list(chain([1,2,3], singleton("foo")))
[1, 2, 3, 'f', 'o', 'o']
如果itertools
提供类似的东西会很好singleton
,但是第三方more-itertools
模块确实提供always_iterable
了,它做同样的事情(更好的是,它默认将str
和bytes
视为“不可迭代”,并可选择迭代其内容。)
(请检查一下always_iterable
,即使您不想安装整个模块。它可能比singleton
我上面写的 hacky 版本更好。)
推荐阅读
- ruby-on-rails - 安装错误 Ruby on Rails (Windows 7 & 10)
- python - 数据由多个空格分隔,想逐行放到一个.txt文件中
- typescript - 在模块中定义全局函数
- node.js - 邮递员返回空响应
- python - Python Matplotlib 不能将序列乘以“浮点”类型的非整数
- python - 在 Python 中根据条件创建一个新列
- apache-spark - 允许 Cerner Bunsen 加载 FHIR R4 (ukcore) 的依赖项是什么?
- c# - 如何定义从类继承的任何特定类型的列表?
- java - 如何在java中另一个类的变量上使用运算符
- ms-access - 如何根据另一个字段的值过滤 MS Access 字段