我想知道如何创建宽容字典(如果引发KeyError则返回默认值).
在下面的代码示例中,我将得到一个KeyError; 例如
a = {'one':1,'two':2}
print a['three']
Run Code Online (Sandbox Code Playgroud)
为了不得到一个我将1.必须捕获异常或使用获取.
我不想用我的字典那样做...
我想知道是否有更聪明的方法来从集合中创建默认字典.dict应该有一个空的numpy ndarray作为默认值.
到目前为止,我最好的结果是:
import collections
d = collections.defaultdict(lambda: numpy.ndarray(0))
Run Code Online (Sandbox Code Playgroud)
但是,我想知道是否有可能跳过lambda术语并以更直接的方式创建dict.喜欢:
d = collections.defaultdict(numpy.ndarray(0)) # <- Nice and short - but not callable
Run Code Online (Sandbox Code Playgroud) 我defaultdict用来存储数百万个短语,所以我的数据结构看起来像mydict['string'] = set(['other', 'strings']).它似乎适用于较小的套装但是当我击中任何超过1000万个按键时,我的程序只是崩溃了有用的信息Process killed.我知道defaultdict内存很重,但是有一个使用defaultdicts 存储的优化方法还是我必须查看其他数据结构,如numpy数组?
谢谢
collections.defaultdict当您将default_factory作为位置参数传递时,Python 2.7.5 似乎才有效 - 当您将其作为命名参数传递时,它会中断.
如果您运行以下代码,您将看到default_dict_success()运行正常,但default_dict_failure()抛出一个KeyError.
from collections import defaultdict
test_data = [
('clay', 'happy'),
('jason', 'happy'),
('aj', 'sad'),
('eric', 'happy'),
('sophie', 'sad')
]
def default_dict_success():
results = defaultdict(list)
for person, mood in test_data:
results[mood].append(person)
print results
def default_dict_failure():
results = defaultdict(default_factory=list)
for person, mood in test_data:
results[mood].append(person)
print results
default_dict_success()
default_dict_failure()
Run Code Online (Sandbox Code Playgroud)
输出是
# First function succeeds
defaultdict(<type 'list'>, {'sad': ['aj', 'sophie'], 'happy': ['clay', 'jason', 'eric']})
# Second function fails
Traceback (most recent …Run Code Online (Sandbox Code Playgroud) 这个问题遵循问题:如何从文件中读取两行并在for循环中创建动态键?
但是,问题的性质已演变为我想要解决的某种复杂性.
下面是按空格分隔的数据结构.
chr pos M1 M2 Mk Mg1 F1_hybrid F1_PG F1_block S1 Sk1 S2 Sj
2 16229767 T/T T/T T/T G/T C|T 1|0 726 . T/C T/C T/C
2 16229783 C/C C/C C/C A/C G|C 0|1 726 G/C G/C G/C C|G
2 16229992 A/A A/A A/A G/A G|A 1|0 726 A/A A/A A/A A|G
2 16230007 T/T T/T T/T A/T A|T 1|0 726 A|T A|T A|T A|T
2 16230011 G/G G/G G/G G/G C|G 1|0 726 G/C C|G …Run Code Online (Sandbox Code Playgroud) 我有一个列表字典,它应该用默认密钥初始化.我猜,下面的代码不好(我的意思是,它有效,但我觉得它不是用pythonic方式编写的):
d = {'a' : [], 'b' : [], 'c' : []}
Run Code Online (Sandbox Code Playgroud)
所以我想使用更像pythonic的东西defaultict:
d = defaultdict(list)
Run Code Online (Sandbox Code Playgroud)
但是,我见过的每个教程都会动态设置新密钥.但在我的情况下,所有的键都应该从一开始就定义.我正在解析其他数据结构,只有当结构中的特定键也包含在我的字典中时,才会向我的字典添加值.
如何设置默认密钥?
在以下代码中:
from collections import defaultdict
confusion_proba_dict = defaultdict(float)
for i in xrange(10):
confusion_proba_dict[i] = i + 10
print confusion_proba_dict
Run Code Online (Sandbox Code Playgroud)
输出是:
defaultdict(<type 'float'>, {0: 10, 1: 11, 2: 12, 3: 13, 4: 14, 5: 15, 6: 16, 7: 17, 8: 18, 9: 19})
Run Code Online (Sandbox Code Playgroud)
但是,我需要输出为:
{0: 10, 1: 11, 2: 12, 3: 13, 4: 14, 5: 15, 6: 16, 7: 17, 8: 18, 9: 19}
Run Code Online (Sandbox Code Playgroud)
我该怎么做?
有代码.
from collections import defaultdict
class A(defaultdict):
def __init__(self):
super(A, self).__init__(lambda :0)
self.x = 1
def my_copy(self):
return self.copy()
if __name__ == '__main__':
a = defaultdict(lambda :0)
b = a.copy() # no error when using the base class directly
a = A()
b = a.my_copy()
Run Code Online (Sandbox Code Playgroud)
有错误:
Traceback (most recent call last):
File "/Applications/PyCharm.app/Contents/helpers/pydev/pydevd.py", line 1591, in <module>
globals = debugger.run(setup['file'], None, None, is_module)
File "/Applications/PyCharm.app/Contents/helpers/pydev/pydevd.py", line 1018, in run
pydev_imports.execfile(file, globals, locals) # execute the script
File "/Applications/PyCharm.app/Contents/helpers/pydev/_pydev_imps/_pydev_execfile.py", line 18, …Run Code Online (Sandbox Code Playgroud) 我正在阅读有关集合 defaultdict 的信息,并遇到了以下代码行:
import collections
tree = lambda: collections.defaultdict(tree)
some_dict = tree()
some_dict['colours']['favourite'] = "yellow"
Run Code Online (Sandbox Code Playgroud)
我知道lamba接受一个变量并对其执行一些功能。我见过 lambda 是这样使用的: lambda x: x + 3 在上面的第二行代码中,lambda 使用什么变量,它执行什么功能?
我也明白 defaultdict 可以采用 int 或 list 等参数。在第二行中,defaultdict 接受参数树,它是一个变量。那有什么意义呢?
我们知道在Python 3.6中,字典是作为实现细节排序的插入,并且可以依赖3.7插入顺序.
我希望这也适用于dict诸如collections.Counter和的子类collections.defaultdict.但这似乎只适用于defaultdict此案.
所以我的问题是:
defaultdict但不适用于Counter?如果是这样,是否有直接的解释?dict将collections模块中这些子类的顺序视为实现细节?或者,例如,我们可以依赖于defaultdict像dictPython 3.7+ 那样的插入顺序吗?以下是我的基本测试:
dict:有序
words = ["oranges", "apples", "apples", "bananas", "kiwis", "kiwis", "apples"]
dict_counter = {}
for w in words:
dict_counter[w] = dict_counter.get(w, 0)+1
print(dict_counter)
# {'oranges': 1, 'apples': 3, 'bananas': 1, 'kiwis': 2}
Run Code Online (Sandbox Code Playgroud)
反:无序
from collections import Counter, defaultdict
print(Counter(words))
# Counter({'apples': 3, 'kiwis': 2, 'oranges': 1, 'bananas': 1})
Run Code Online (Sandbox Code Playgroud)
defaultdict:ordered
dict_dd …Run Code Online (Sandbox Code Playgroud) defaultdict ×10
python ×10
dictionary ×4
numpy ×3
collections ×2
arguments ×1
copy ×1
counter ×1
inheritance ×1
lambda ×1
large-data ×1
pandas ×1
parameters ×1
python-3.x ×1