我试图从ordereddict创建一个pandas数据帧,以保持值的顺序.但由于某些原因,在创建数据帧后,字段再次混乱.
这是orderdicts列表:
[OrderedDict([
('key_a',
'value_a'),
('key_b',
'value_b'),
]),
OrderedDict([
('key_a',
'value_c'),
('key_b',
'value_d'),
])
]
Run Code Online (Sandbox Code Playgroud)
现在我应该如何从这些创建一个pandas DataFrame?我正在寻找的是类似的东西(重要的是key_a和key_b等列名称顺序):
key_a key_b
0 value_a value_b
1 value_c value_d
Run Code Online (Sandbox Code Playgroud)
我试过了:
pd.DataFrame.from_records(orderedDictList)
pd.DataFrame.from_dict(orderedDictList)
Run Code Online (Sandbox Code Playgroud)
随意提出任何其他问题.
Say orig
是一个OrderedDict
包含普通字符串:字符串键值对的,但有时值可能是另一个嵌套的OrderedDict
.
我想orig
按键,按字母顺序(升序)排序,并以递归方式进行排序.
规则:
需要协助sorted
算法:
import string
from random import choice
orig = OrderedDict((
('a', choice(string.digits)),
('b', choice(string.digits)),
('c', choice(string.digits)),
('special', OrderedDict((
('a', choice(string.digits)),
('b', choice(string.digits)),
('c', choice(string.digits)),
)))
))
sorted_copy = OrderedDict(sorted(orig.iteritems(), ...))
self.assertEqual(orig, sorted_copy)
Run Code Online (Sandbox Code Playgroud) 我有一个有序的字典,想要改变个别订单.在下面的代码示例中,我希望项目3(人员)及其值移动到位置2.因此,顺序将是动物,人,食物,饮料.我怎么去他的?
import collections
queue = collections.OrderedDict()
queue["animals"] = ["cat", "dog", "fish"]
queue["food"] = ["cake", "cheese", "bread"]
queue["people"] = ["john", "henry", "mike"]
queue["drinks"] = ["water", "coke", "juice"]
print queue
Run Code Online (Sandbox Code Playgroud) 你如何获得Python OrderedDict中的前3个元素?
也可以从该字典中删除数据.
例如:我如何获得Python OrderedDict中的前3个元素并删除其余元素?
为什么OrderedDict
键视图比较顺序不敏感?
>>> from collections import OrderedDict
>>> xy = OrderedDict([('x', None), ('y', None)])
>>> yx = OrderedDict([('y', None), ('x', None)])
>>> xy == yx
False
>>> xy.keys() == yx.keys()
True
Run Code Online (Sandbox Code Playgroud)
OrderedDict键视图应该表现得像OrderedSet,但它的行为相同dict.keys
(就像通常一样set
).
python2中的"问题"相同:
>>> xy.viewkeys() == yx.viewkeys()
True
Run Code Online (Sandbox Code Playgroud)
它们是不同的类型,(odict_keys
是子类dict_keys
)
>>> type(xy.keys())
odict_keys
>>> type({}.keys())
dict_keys
Run Code Online (Sandbox Code Playgroud)
并且已经存在一个可以轻易使用的顺序敏感键比较,但它显然仅用作对odict丰富比较的后检查.
这是设计决定还是错误?如果这是一个设计决定,我在哪里可以找到理由的讨论?
根据PEP 468:
从版本3.6开始,Python将保留传递给函数的关键字参数的顺序.为了实现这一点,收集的kwargs现在将是有序映射.请注意,这并不一定意味着
OrderedDict
.
在这种情况下,为什么这个有序映射无法与Python的规范有序映射类型进行相等比较,collections.OrderedDict
:
>>> from collections import OrderedDict
>>> data = OrderedDict(zip('xy', 'xy'))
>>> def foo(**kwargs):
... return kwargs == data
...
>>> foo(x='x', y='y') # expected result: True
True
>>> foo(y='y', x='x') # expected result: False
True
Run Code Online (Sandbox Code Playgroud)
虽然现在保留了迭代顺序,但kwargs
似乎表现得像比较的普通字典.从3.5开始,Python有一个C实现的有序字典,因此它可以直接使用(或者,如果性能仍然是一个问题,使用3.6紧凑字典的瘦子类更快的实现).
为什么函数接收的有序映射不会在相等比较中遵循排序?
我首次尝试将collections
模块中两个字典的功能组合在一起,创建一个继承它们的类:
from collections import OrderedDict, defaultdict
class DefaultOrderedDict(defaultdict, OrderedDict):
def __init__(self, default_factory=None, *a, **kw):
super().__init__(default_factory, *a, **kw)
Run Code Online (Sandbox Code Playgroud)
但是,我无法为此词典分配项目:
d = DefaultOrderedDict(lambda: 0)
d['a'] = 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python3.3/collections/__init__.py", line 64, in __setitem__
self.__map[key] = link = Link()
AttributeError: 'DefaultOrderedDict' object has no attribute '_OrderedDict__map'
Run Code Online (Sandbox Code Playgroud)
实际上,关于如何创建类似对象的这个问题有通过扩展OrderedDict
类并手动重新实现所提供的其他方法来实现它的答案defaultdict
.使用多重继承会更清晰.为什么不起作用?
python multiple-inheritance ordereddictionary python-3.x defaultdict
我想要一个排序的字典.但之间的项目的顺序mydict
和orddict
似乎并没有改变.
from collections import OrderedDict
mydict = {'a':1,'b':2,'c':3,'d':4}
orddict = OrderedDict(mydict)
print(mydict,orddict)
# print items in mydict:
print('mydict')
for k,v in mydict.items():
print(k,v)
print('ordereddict')
# print items in ordered dictionary
for k,v in orddict.items():
print(k,v)
# print the dictionary keys
# for key in mydict.keys():
# print(key)
# print the dictionary values
# for value in mydict.values():
# print(value)
Run Code Online (Sandbox Code Playgroud) def izracunaj_dohvatljiva_stanja(funkcije_prijelaza):
dohvatljiva = []
dohvatljiva.extend(pocetno_stanje)
pomocna = collections.OrderedDict
for i in xrange(len(dohvatljiva)):
for temp in pomocna.keys(): <-----------------------------------this line
if temp.split(',')[0] == dohvatljiva[i]:
if funkcije_prijelaza.get(temp) not in dohvatljiva:
dohvatljiva.extend(funkcije_prijelaza.get(temp))
Run Code Online (Sandbox Code Playgroud)
我试图从有序的dict获取所有键,所以我可以迭代它但运行错误后发生: 点击图片
此检查报告声明的参数和实际参数之间的差异,以及不正确的参数(例如,重复的命名参数)和不正确的参数顺序.还分析了装饰器.
那就是PyCharm告诉我的.这是一个弱警告,所以我的代码运行正常.
import collections
var_dict = {}
var_dict = collections.OrderedDict(sorted(var_dict.items()))
Run Code Online (Sandbox Code Playgroud)
^这是有问题的代码行.我相信警告与OrderedDict
电话有关.
我检查了Python 3.5 的OrderedDict文档,但我仍然感到困惑.
为什么我收到这个警告?我正在使用PyCharm Community Edition 5.0.1
python ×9
python-3.x ×4
collections ×2
dictionary ×2
dataframe ×1
defaultdict ×1
function ×1
key ×1
kwargs ×1
pandas ×1
pycharm ×1
python-2.7 ×1
python-3.6 ×1
recursion ×1
sorting ×1