我正在学习如何使用泡菜.我创建了一个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) 我在实现时遇到了问题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
这是怎么回事?
我有一个字典,如:
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一样可用.
我可以通过名称访问命名元组的元素,如下所示(*):
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 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()?).
这是故意的吗?我们不应该使用这种模式将命名元组转换为字典吗?
我有一个带集合的模块:
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".
我怎么能得到这个名字?
最好的祝福
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'?
获取包含标题行的数据文件并将此行读入命名元组的最佳方法是什么,以便可以通过标题名称访问数据行?
我正在尝试这样的事情:
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方法是什么?
我正在尝试创建一个子类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) namedtuple ×10
python ×10
python-3.x ×2
class ×1
csv ×1
dictionary ×1
isinstance ×1
pickle ×1
python-2.7 ×1
python-3.5 ×1
typeerror ×1
typename ×1