相关疑难解决方法(0)

Python hashable dicts

作为一个练习,主要是为了我自己的娱乐,我正在实现一个回溯包装解析器.对此的灵感是我想更好地了解hygenic宏如何在类似algol的语言中工作(与你通常在其中找到的语法免费lisp方言相对应).因此,通过输入的不同传递可能会看到不同的语法,因此缓存的解析结果无效,除非我还存储语法的当前版本以及缓存的解析结果.(编辑:使用键值集合的结果是它们应该是不可变的,但我不打算公开接口以允许它们被更改,因此可变或不可变集合都可以)

问题是python dicts不能作为其他dicts的键.即使使用元组(正如我将要做的那样)也无济于事.

>>> cache = {}
>>> rule = {"foo":"bar"}
>>> cache[(rule, "baz")] = "quux"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
>>> 
Run Code Online (Sandbox Code Playgroud)

我想它必须一直是元组.现在python标准库提供了我所需要的,collections.namedtuple具有非常不同的语法,但可以用作键.继续上述会议:

>>> from collections import namedtuple
>>> Rule = namedtuple("Rule",rule.keys())
>>> cache[(Rule(**rule), "baz")] = "quux"
>>> cache
{(Rule(foo='bar'), 'baz'): 'quux'}
Run Code Online (Sandbox Code Playgroud)

好.但是我必须为我想要使用的规则中的每个可能的键组合创建一个类,这不是那么糟糕,因为每个解析规则确切地知道它使用了什么参数,因此可以同时定义该类作为解析规则的函数.

编辑:namedtuples 的另一个问题是它们是严格定位的.两个看起来应该不同的元组实际上可以是相同的:

>>> you = namedtuple("foo",["bar","baz"])
>>> me = namedtuple("foo",["bar","quux"])
>>> you(bar=1,baz=2) == me(bar=1,quux=2)
True
>>> bob = namedtuple("foo",["baz","bar"]) …
Run Code Online (Sandbox Code Playgroud)

python

79
推荐指数
7
解决办法
5万
查看次数

在Python中,如何编写包含集合的集合?

我们在Python中知道,可以通过写出它的所有元素来定义一个集合:

a_set={1,"xyz"}
Run Code Online (Sandbox Code Playgroud)

Python的书籍都说集合的元素可以是任何数据类型.所以我们应该能够写出一个包含集合的集合.我试着把它写成:

a_set={1,{"xyz"}}
Run Code Online (Sandbox Code Playgroud)

IDLE报告了一个错误:

Traceback (most recent call last):
  File "<pyshell#58>", line 1, in <module>
    a_set={1,{"xyz"}}
TypeError: unhashable type: 'set'
Run Code Online (Sandbox Code Playgroud)

我想这可能是因为Python试图将其理解为字典.那么,如何写出一个包含Python集合的集合?

python

7
推荐指数
2
解决办法
2214
查看次数

在python Dataframe中为AB,BA对分配相同的随机值

我有一个像Dataframe这样的

 Sou  Des
  1    3
  1    4
  2    3
  2    4
  3    1
  3    2
  4    1
  4    2
Run Code Online (Sandbox Code Playgroud)

我需要为0到1之间的每一对分配随机值,但必须为类似的对分配相同的随机值,如"1-3","3-1"和其他对.我期待结果数据框如

 Sou  Des   Val
  1    3    0.1
  1    4    0.6
  2    3    0.9
  2    4    0.5
  3    1    0.1
  3    2    0.9
  4    1    0.6
  4    2    0.5
Run Code Online (Sandbox Code Playgroud)

如何在python pandas中为"AB"和"BA"分配相同的随机值类似的对.

python dataframe pandas

7
推荐指数
1
解决办法
503
查看次数

为什么可变实体不能成为字典键?

考虑以下Python解释器shell会话:

>>> class D(dict):
...   def __hash__(self):
...     return id(self)
... 
>>> d1 = D({'a': 'b'})
>>> d2 = D({'a1': 'b1'})
>>> t = {d1: 1, d2: 2}
>>> t[d1]
1
>>> t[d2]
2
Run Code Online (Sandbox Code Playgroud)

为什么没有dict的__hash__默认值id()?导致禁止使用可变实体作为字典键的设计决定是什么?

python dictionary

1
推荐指数
1
解决办法
472
查看次数

标签 统计

python ×4

dataframe ×1

dictionary ×1

pandas ×1