标签: namedtuple

如何正确地pickle一个namedtuple实例

我正在学习如何使用泡菜.我创建了一个namedtuple对象,将其附加到列表中,并试图挑选该列表.但是,我收到以下错误:

pickle.PicklingError: Can't pickle <class '__main__.P'>: it's not found as __main__.P
Run Code Online (Sandbox Code Playgroud)

我发现,如果我运行代码而不将其包装在函数中,它就可以完美地运行.在函数内部包装时,是否需要额外的步骤来腌制对象?

这是我的代码:

from collections import namedtuple
import pickle

def pickle_test():
    P = namedtuple("P", "one two three four")
    my_list = []
    abe = P("abraham", "lincoln", "vampire", "hunter")
    my_list.append(abe)
    f = open('abe.pickle', 'w')
    pickle.dump(abe, f)
    f.close()

pickle_test()
Run Code Online (Sandbox Code Playgroud)

python pickle namedtuple python-2.7

45
推荐指数
4
解决办法
2万
查看次数

Python:namedtuple._replace()不能像文档中描述的那样工作

我在实现时遇到了问题namedtuple._replace(),因此我直接从文档中复制了代码:

Point = namedtuple('Point', 'x,y')

p = Point(x=11, y=22)

p._replace(x=33)

print p
Run Code Online (Sandbox Code Playgroud)

我得到了:

Point(x=11, y=22)
Run Code Online (Sandbox Code Playgroud)

代替:

Point(x=33, y=22)
Run Code Online (Sandbox Code Playgroud)

正如文件中所示.

我在Windows 7上使用Python 2.6

这是怎么回事?

python namedtuple

41
推荐指数
4
解决办法
3万
查看次数

Pythonic将字典转换为namedtuple的方法,还是另一个Hashable dict-like?

我有一个字典,如:

d = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
Run Code Online (Sandbox Code Playgroud)

我想将其转换为namedtuple.我目前的方法是使用以下代码

namedTupleConstructor = namedtuple('myNamedTuple', ' '.join(sorted(d.keys())))
nt= namedTupleConstructor(**d)
Run Code Online (Sandbox Code Playgroud)

哪个产生

myNamedTuple(a = 1,b = 2,c = 3,d = 4)

这对我来说很好(我认为),但我错过了内置如...

nt = namedtuple.from_dict() ?
Run Code Online (Sandbox Code Playgroud)

更新:正如评论中所讨论的那样,我想将我的字典转换为一个命名元组的原因是它变得可以清洗,但仍然像dict一样可用.

python dictionary namedtuple

39
推荐指数
4
解决办法
2万
查看次数

如何使用字段名称的变量访问namedtuple的字段?

我可以通过名称访问命名元组的元素,如下所示(*):

from collections import namedtuple
Car = namedtuple('Car', 'color mileage')
my_car = Car('red', 100)
print my_car.color
Run Code Online (Sandbox Code Playgroud)

但是如何使用变量来指定我想要访问的字段的名称?例如

field = 'color'
my_car[field] # doesn't work
my_car.field # doesn't work
Run Code Online (Sandbox Code Playgroud)

我的实际用例是我正在迭代pandas数据帧for row in data.itertuples().我正在对特定列的值执行操作,并且我希望能够指定要按名称使用的列作为包含此循环的方法的参数.

(*)从这里取的例子.我使用的是Python 2.7.

python namedtuple

37
推荐指数
3
解决办法
1万
查看次数

36
推荐指数
3
解决办法
1万
查看次数

关于`namedtuple`的一些内容在3.5.1中有所改变吗?

在Python 3.5.0上:

>>> from collections import namedtuple
>>> cluster = namedtuple('Cluster', ['a', 'b'])
>>> c = cluster(a=4, b=9)
>>> c
Cluster(a=4, b=9)
>>> vars(c)
OrderedDict([('a', 4), ('b', 9)])
Run Code Online (Sandbox Code Playgroud)

在Python 3.5.1上:

>>> from collections import namedtuple
>>> cluster = namedtuple('Cluster', ['a', 'b'])
>>> c = cluster(a=4, b=9)
>>> c
Cluster(a=4, b=9)
>>> vars(c)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: vars() argument must have __dict__ attribute
Run Code Online (Sandbox Code Playgroud)

似乎有些事情发生了namedtuple变化(或者可能是某些事情vars()?).

这是故意的吗?我们不应该使用这种模式将命名元组转换为字典吗?

python typeerror namedtuple python-3.5

34
推荐指数
3
解决办法
3062
查看次数

从namedtuple获取值的名称

我有一个带集合的模块:

import collections
named_tuple_sex = collections.namedtuple(
                    'FlightsResultsSorter',
                        ['TotalPriceASC',
                         'TransfersASC',
                         'FlightTimeASC',
                         'DepartureTimeASC',
                         'DepartureTimeDESC',
                         'ArrivalTimeASC',
                         'ArrivalTimeDESC',
                         'Airlines']
                    )
FlightsResultsSorter = named_tuple_sex(
    FlightsResultsSorter('TotalPrice', SortOrder.ASC),
    FlightsResultsSorter('Transfers', SortOrder.ASC),
    FlightsResultsSorter('FlightTime', SortOrder.ASC),
    FlightsResultsSorter('DepartureTime', SortOrder.ASC),
    FlightsResultsSorter('DepartureTime', SortOrder.DESC),
    FlightsResultsSorter('ArrivalTime', SortOrder.ASC),
    FlightsResultsSorter('ArrivalTime', SortOrder.DESC),
    FlightsResultsSorter('Airlines', SortOrder.ASC)
)
Run Code Online (Sandbox Code Playgroud)

在另一个模块中,我按此集合进行迭代,我想得到项目的名称:

for x in FlightsResultsSorter:
            self.sort(x)
Run Code Online (Sandbox Code Playgroud)

所以在代码中我想要代替x(对象)传递例如"DepartureTimeASC"或"ArrivalTimeASC".

我怎么能得到这个名字?

最好的祝福

python namedtuple

33
推荐指数
2
解决办法
3万
查看次数

在namedtuple中typename的相关性

from collections import namedtuple

Point = namedtuple('whatsmypurpose',['x','y'])
p = Point(11,22)
print(p)
Run Code Online (Sandbox Code Playgroud)

输出:

whatsmypurpose(x=11,y=22)
Run Code Online (Sandbox Code Playgroud)

什么是相关性/用途'whatsmypurpose'

python typename namedtuple python-3.x

32
推荐指数
2
解决办法
2645
查看次数

什么是将CSV文件数据作为命名元组行读取的pythonic方法?

获取包含标题行的数据文件并将此行读入命名元组的最佳方法是什么,以便可以通过标题名称访问数据行?

我正在尝试这样的事情:

import csv
from collections import namedtuple

with open('data_file.txt', mode="r") as infile:
    reader = csv.reader(infile)
    Data = namedtuple("Data", ", ".join(i for i in reader[0]))
    next(reader)
    for row in reader:
        data = Data(*row)
Run Code Online (Sandbox Code Playgroud)

reader对象不是可订阅的,所以上面的代码抛出了一个TypeError.将文件头读入namedtuple的pythonic方法是什么?

python csv namedtuple

31
推荐指数
2
解决办法
1万
查看次数

无法为namedtuple的子类设置属性

它看起来像这个这个有点相关的线程,但仍然没有弄清楚:)

我正在尝试创建一个子类namedtuple并提供不同的初始化器,以便我可以以不同的方式构造对象.例如:

>>> from collections import namedtuple
>>> class C(namedtuple("C", "x, y")) :
...     __slots__ = ()
...     def __init__(self, obj) : # Initialize a C instance by copying values from obj
...         self.x = obj.a
...         self.y = obj.b
...     def __init__(self, x, y) : # Initialize a C instance from the parameters
...         self.x = x
...         self.y = y
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用:

>>> c = C(1, 2)
Traceback (most recent call last):
  File …
Run Code Online (Sandbox Code Playgroud)

python class namedtuple python-3.x

27
推荐指数
3
解决办法
3万
查看次数