我有一个如下所示的数据列表:
// 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())这样的东西:如果它在那里,附加数据,如果没有创建将空列表作为字典值,然后在下一个循环中追加数据.
我们来看看吧
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
功能,以便为缺失的密钥创建一个新的空列表.
我想你想使用setdefault.使用它有点奇怪,但完全符合您的需要.
d.setdefault(t, []).append(c)
如果该键存在.setdefault
,该方法将返回绑定到dict键的元素(在我们的示例中为列表)t
.如果没有,它会将空列表绑定到键t
并返回它.所以无论哪种方式,都会有一个列表,.append
然后该方法可以将元组附加c
到.