有没有办法让defaultdict默认返回密钥?或者一些具有同等行为的数据结构?即,在初始化字典后d,
>>> d['a'] = 1
>>> d['a']
1
>>> d['b']
'b'
>>> d['c']
'c'
Run Code Online (Sandbox Code Playgroud)
我只看到默认字典采用不带参数的函数,所以我不确定除了创建一种新的字典之外是否还有其他解决方案.
我有一个数据结构,如下所示:
不同年份的三个城市的人口如下.
Name 1990 2000 2010
A 10 20 30
B 20 30 10
C 30 10 20
Run Code Online (Sandbox Code Playgroud)
我用a defaultdict来存储数据.
from collections import defaultdict
cityPopulation=defaultdict(list)
cityPopulation['A']=[10,20,30]
cityPopulation['B']=[20,30,10]
cityPopulation['C']=[30,10,20]
Run Code Online (Sandbox Code Playgroud)
我想defaultdict根据列表中的特定列(年份)对其进行排序.比如说,1990年的排序,应该给C,B,A,而2010年的排序应该给A,C,B.
此外,这是存储数据的最佳方式吗?当我改变人口价值时,我希望它是可变的.
我见过其他Python程序员使用collections模块中的defaultdict来实现以下用例:
from collections import defaultdict
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
def main():
d = defaultdict(list)
for k, v in s:
d[k].append(v)
Run Code Online (Sandbox Code Playgroud)
我通常使用setdefault来解决这个问题:
def main():
d = {}
for k, v in s:
d.setdefault(k, []).append(v)
Run Code Online (Sandbox Code Playgroud)
文档实际上声称使用defaultdict更快,但我在测试自己时看到了相反的情况:
$ python -mtimeit -s "from withsetdefault import main; s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)];" "main()"
100000 loops, best of 3: 4.51 usec per loop
$ python -mtimeit -s "from withdefaultdict …Run Code Online (Sandbox Code Playgroud) python collections setdefault defaultdict python-collections
我在使用新的 defaultdict(dict) 设置简单的数据类时遇到问题。
如果我告诉工厂使用“dict”,如下所示,实例化将失败并出现typerror collection.defaultdict对象不可调用
from collections import defaultdict
from dataclasses import dataclass, field
@dataclass
class ResultSet:
changed: bool = False
mqttdata: defaultdict(dict) = field(default_factory=defaultdict(dict)) # does not work!
Run Code Online (Sandbox Code Playgroud)
它确实使用field(default_factory=defaultdict)工作,但是当我的代码遇到丢失的键时,它会失败 - 大概是因为没有为 dict 设置 defaultdict。
如何在数据类中正确设置新的defaultdict(dict)?
我根本没有使用Python中的线程,并且认为这个问题是一个完全陌生的问题.
我想知道是否defaultdict是线程安全的.让我来解释一下:
我有
d = defaultdict(list)
Run Code Online (Sandbox Code Playgroud)
默认情况下会创建缺失键列表.假设我有多个线程同时开始执行此操作:
d['key'].append('value')
Run Code Online (Sandbox Code Playgroud)
最后,我应该最终结束['value', 'value'].但是,如果defaultdict不是线程安全的,如果线程1在检查之后和之前 产生线程2,它将导致交错,而另一个线程将创建列表并且可能附加.if 'key' in dictd['key'] = default_factory()d['key']'value'
然后当线程1再次执行时,它将继续从中d['key'] = default_factory()破坏现有的列表和值,我们将最终进入['key'].
我查看了defaultdict的CPython源代码.但是,我找不到任何锁或互斥锁.我想只要记录在案,它就不是线程安全的.
有些人昨晚在IRC上表示Python上有GIL,所以它在概念上是线程安全的.有人说线程不应该在Python中完成.我很困惑.想法?
假设我有一个清单.
temp = ['A', 'B', 'A', 'B', 'A', 'B']
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种方法来加入里面的字符串计数.
预期产出:
['A_1', 'B_1', 'A_2', 'B_2', 'A_3', 'B_3']
Run Code Online (Sandbox Code Playgroud)
我能够通过使用列表解析来解决它,但我正在寻找一种方法,我不必指定列表[1, 1, 2, 2, 3, 3].可能吗?
[j + "_" + str(i) for i, j in zip([1, 1, 2, 2, 3, 3], temp)]
Run Code Online (Sandbox Code Playgroud) collections.defaultdict是很棒的.特别是与lambda:
>>> import collections
>>> a = collections.defaultdict(lambda : [None,None])
>>> a['foo']
[None, None]
Run Code Online (Sandbox Code Playgroud)
有没有办法'foo'在lambda中使用给定的键(例如)?例如(不起作用):
>>> a = collections.defaultdict(lambda : [None]*key)
>>> a[1]
[None]
>>> a[2]
[None, None]
>>> a
defaultdict(<function <lambda> at 0x02984170>, {1: [None], 2: [None, None]})
Run Code Online (Sandbox Code Playgroud) 使用Python字典时,我通常使用以下习语:
try:
val = dct[key]
except KeyError:
print key, " is not valid"
Run Code Online (Sandbox Code Playgroud)
因为对于大型词典而言
if key in dct:
# do something
Run Code Online (Sandbox Code Playgroud)
效率不高(所以我记得读书,但我在实践中也注意到了)
今天我正在使用defaultdict,有一会儿我忘记了defaultdict永远不会给你一个KeyError,而是会更新原始字典.
如何在不更新defaultdict的情况下执行查找?我真的需要打印一个错误,以便用户可以重新输入密钥.
谢谢!
更新:几张海报表明我的信念if key in dct:很慢是错误的.我回去检查了我读过的最好用的书try: except:.它是2002年的Python Cookbook,Alex Martelli的Recipe 1.4,也可以在这里找到:在词典中添加一个条目.旧的记忆是如此不可靠!配方中没有提到"慢",它甚至没有使用in,但has_key.它只是说它try: except:更像Pythonic(至少是配方的书籍版本).感谢您的纠正和答案.
因此,defaultdict文档提到,如果缺少某个项,则default_factory" 返回的值将插入到密钥的字典中,并返回".这在大多数时候都很棒,但在这种情况下我真正想要的是返回值但不插入defaultdict.
我想我可能是子类defaultdict并覆盖......我猜__missing__?不确定.最好的方法是什么?
提前致谢.
如果a defaultdict可以沿着以下行初始化将是方便的
d = defaultdict(list, (('a', 1), ('b', 2), ('c', 3), ('d', 4), ('a', 2),
('b', 3)))
Run Code Online (Sandbox Code Playgroud)
生产
defaultdict(<type 'list'>, {'a': [1, 2], 'c': [3], 'b': [2, 3], 'd': [4]})
Run Code Online (Sandbox Code Playgroud)
相反,我得到了
defaultdict(<type 'list'>, {'a': 2, 'c': 3, 'b': 3, 'd': 4})
Run Code Online (Sandbox Code Playgroud)
为了得到我需要的东西,我最终必须这样做:
d = defaultdict(list)
for x, y in (('a', 1), ('b', 2), ('c', 3), ('d', 4), ('a', 2), ('b', 3)):
d[x].append(y)
Run Code Online (Sandbox Code Playgroud)
这是国际海事组织的一步,应该是必要的,我在这里错过了什么?
defaultdict ×10
python ×9
collections ×3
dictionary ×3
counter ×1
lambda ×1
list ×1
python-3.x ×1
setdefault ×1
sorting ×1
string ×1