当前位置:  开发笔记 > 编程语言 > 正文

在Python词典中存储和更新列表:为什么会发生这种情况?

如何解决《在Python词典中存储和更新列表:为什么会发生这种情况?》经验,为你挑选了2个好方法。

我有一个如下所示的数据列表:

// timestep,x_position,y_position
0,4,7
0,2,7
0,9,5
0,6,7
1,2,5
1,4,7
1,9,0
1,6,8

......我希望看起来像这样:

0, (4,7), (2,7), (9,5), (6,7)
1, (2,5), (4,7), (9,0), (6.8)

我的计划是使用字典,其中t的值是字典的键,而键的值是列表.然后我可以将每个(x,y)附加到列表中.就像是:

# where t = 0, c = (4,7), d = {}

# code 1
d[t].append(c)

现在这会导致IDLE失败.但是,如果我这样做:

# code 2
d[t] = []
d[t].append(c)

......这很有效.

所以问题是:为什么代码2工作,但代码1不工作?

PS我计划做的任何改进都会引起极大的兴趣!我想我必须通过输入检查每个循环上的字典,看看字典键是否已经存在,我想通过使用像max(d.keys())这样的东西:如果它在那里,附加数据,如果没有创建将空列表作为字典值,然后在下一个循环中追加数据.



1> S.Lott..:

我们来看看吧

d[t].append(c)

有什么价值d[t]?试试吧.

d = {}
t = 0
d[t]

你得到了什么?哦.没有什么d是关键的t.

现在尝试一下.

d[t] = []
d[t]

啊.现在有一些d关键的东西t.

你可以做几件事.

    使用示例2.

    使用setdefault. d.setdefault(t,[]).append(c).

    使用collections.defaultdict.你使用的defaultdict(list)是一个简单的字典,而不是一个简单的字典{}.


编辑1.优化

给定来自上述形式的文件的输入行:ts,x,y,分组过程是不必要的.没有理由从简单的(ts,x,y)列表到更复杂的(ts,(x,y),(x,y),(x,y),...)列表.原始列表可以在到达时完全处理.

d= collections.defaultdict(list)
for ts, x, y in someFileOrListOrQueryOrWhatever:
    d[ts].append( (x,y) )

编辑2.回答问题

"在初始化字典时,你需要告诉字典键值数据结构是什么样的?"

我不确定这个问题意味着什么.因为,所有词典都是键值结构,所以问题不是很清楚.所以,我将回顾三个可能回答这个问题的方案.

例2.

初始化

d= {}

使用

if t not in d:
    d[t] = list()
d[t].append( c )

每个字典值必须初始化为一些有用的结构.在这种情况下,我们检查密钥是否存在; 当密钥丢失时,我们创建密钥并分配一个空列表.

默认设置

初始化

d= {}

使用

d.setdefault(t,list()).append( c )

在这种情况下,我们利用该setdefault方法获取与密钥关联的值或创建与缺失密钥关联的新值.

默认字典

初始化

import collections
d = collections.defaultdict(list)

使用

d[t].append( c )

defaultdict使用了丢失的钥匙的初始化函数.在这种情况下,我们提供该list功能,以便为缺失的密钥创建一个新的空列表.



2> Tim Pietzcke..:

我想你想使用setdefault.使用它有点奇怪,但完全符合您的需要.

d.setdefault(t, []).append(c)

如果该键存在.setdefault,该方法将返回绑定到dict键的元素(在我们的示例中为列表)t.如果没有,它会将空列表绑定到键t并返回它.所以无论哪种方式,都会有一个列表,.append然后该方法可以将元组附加c到.

推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有