标签: defaultdict

默认为密钥的Python字典?

有没有办法让defaultdict默认返回密钥?或者一些具有同等行为的数据结构?即,在初始化字典后d,

>>> d['a'] = 1
>>> d['a']
1
>>> d['b']
'b'
>>> d['c']
'c'
Run Code Online (Sandbox Code Playgroud)

我只看到默认字典采用不带参数的函数,所以我不确定除了创建一种新的字典之外是否还有其他解决方案.

python dictionary defaultdict

21
推荐指数
2
解决办法
1424
查看次数

在python中按值对defaultdict排序

我有一个数据结构,如下所示:

不同年份的三个城市的人口如下.

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 sorting dictionary defaultdict

19
推荐指数
3
解决办法
3万
查看次数

Python的集合模块中的defaultdict是否真的比使用setdefault快?

我见过其他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

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

在 Dataclass 中创建 DefaultDict 时遇到问题

我在使用新的 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-3.x defaultdict python-dataclasses

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

collections.defaultdict是线程安全的吗?

我根本没有使用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中完成.我很困惑.想法?

python defaultdict python-collections

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

如何为列表中的每个唯一val添加计数

假设我有一个清单.

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)

python string counter list defaultdict

16
推荐指数
2
解决办法
1256
查看次数

使用collections.defaultdict中的密钥

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 collections lambda defaultdict

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

如何在不更新字典(Python)的情况下检查defaultdict中的键?

使用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(至少是配方的书籍版本).感谢您的纠正和答案.

python dictionary defaultdict

15
推荐指数
2
解决办法
1万
查看次数

Python defaultdict不插入缺失值

因此,defaultdict文档提到,如果缺少某个项,则default_factory" 返回的值将插入到密钥的字典中,并返回".这在大多数时候都很棒,但在这种情况下我真正想要的是返回值但插入defaultdict.

我想我可能是子类defaultdict并覆盖......我猜__missing__?不确定.最好的方法是什么?

提前致谢.

python collections defaultdict

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

追加到列表的defaultdict的一步初始化?

如果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)

这是国际海事组织的一步,应该是必要的,我在这里错过了什么?

python defaultdict

14
推荐指数
2
解决办法
1万
查看次数