我有一个如下所示的数据列表:
// 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 )
每个字典值都必须初始化为一些有用的结构。在这种情况下,我们检查 key 是否存在;当 key 丢失时,我们创建 key 并分配一个空列表。
设置默认值
初始化
d= {}
使用
d.setdefault(t,list()).append( c )
在这种情况下,我们利用 setdefault
方法获取与键关联的值或创建与缺失键关联的新值。
默认字典
初始化
import collections
d = collections.defaultdict(list)
使用
d[t].append( c )
defaultdict
使用初始化函数来处理缺失的键。在这种情况下,我们提供了 list
函数,以便为缺少的键创建一个新的空列表。
关于python - 在 Python 字典中存储和更新列表 : why does this happen?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/327534/