在我看来,标准库namedtuple类是一种使元组更像字典的方法。如何命名元组比较字典?什么时候使用它们?它们是否适用于非哈希类型?
当前回答
在字典中,只有键必须是可哈希的,而不是值。命名元组没有键,所以可哈希性不是问题。
然而,它们有一个更严格的限制——它们的键等价物,“字段名”,必须是字符串。
基本上,如果你要创建一堆类的实例,比如:
class Container:
def __init__(self, name, date, foo, bar):
self.name = name
self.date = date
self.foo = foo
self.bar = bar
mycontainer = Container(name, date, foo, bar)
并且在__init__中设置属性后不更改它们,您可以使用
Container = namedtuple('Container', ['name', 'date', 'foo', 'bar'])
mycontainer = Container(name, date, foo, bar)
作为替代品。
当然,你可以创建一堆字典,在每个字典中使用相同的键,但假设你只使用有效的Python标识符作为键,并且不需要可变性,
mynamedtuple.fieldname
比
mydict['fieldname']
and
mynamedtuple = MyNamedTuple(firstvalue, secondvalue)
比
mydict = {'fieldname': firstvalue, 'secondfield': secondvalue}
最后,命名元组是有序的,这与常规字典不同,因此您可以按照定义字段的顺序获取项,这与字典不同。
其他回答
元组是不可变的,无论是否命名。Namedtuple只是通过使用名称而不是索引使访问更加方便。您只能为namedtuple使用有效的标识符,它不执行任何散列—而是生成一个新类型。
在字典中,只有键必须是可哈希的,而不是值。命名元组没有键,所以可哈希性不是问题。
然而,它们有一个更严格的限制——它们的键等价物,“字段名”,必须是字符串。
基本上,如果你要创建一堆类的实例,比如:
class Container:
def __init__(self, name, date, foo, bar):
self.name = name
self.date = date
self.foo = foo
self.bar = bar
mycontainer = Container(name, date, foo, bar)
并且在__init__中设置属性后不更改它们,您可以使用
Container = namedtuple('Container', ['name', 'date', 'foo', 'bar'])
mycontainer = Container(name, date, foo, bar)
作为替代品。
当然,你可以创建一堆字典,在每个字典中使用相同的键,但假设你只使用有效的Python标识符作为键,并且不需要可变性,
mynamedtuple.fieldname
比
mydict['fieldname']
and
mynamedtuple = MyNamedTuple(firstvalue, secondvalue)
比
mydict = {'fieldname': firstvalue, 'secondfield': secondvalue}
最后,命名元组是有序的,这与常规字典不同,因此您可以按照定义字段的顺序获取项,这与字典不同。
推荐文章
- 如何测试一个字符串是否包含列表中的一个子字符串,在熊猫?
- 'datetime'模块没有'strptime'属性
- 如何将字典保存到文件?
- 如何在Python中绘制网格?
- 在Python中元组比较是如何工作的?
- 我如何写好的/正确的包__init__.py文件
- 不能pickle <type 'instancemethod'>当使用多处理Pool.map()
- 不区分大小写的替换
- 好的Python模块模糊字符串比较?
- _tkinter。TclError:没有显示名称和没有$ display环境变量
- 在scikit-learn线性回归中找到p值(显著性)
- 如何上传文件与python请求?
- 熊猫未来预警如何压制?
- 如何断言两个列表包含相同的元素在Python?
- Python pandas:将带参数的函数应用到一个序列中