python - 在 Python 字典中存储和更新列表 : why does this happen?

标签 python dictionary list

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

// 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 的东西。

您可以做几件事。

  1. 使用示例 2。
  2. 使用 setdefaultd.setdefault(t,[]).append(c).
  3. 使用 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/

相关文章:

模式匹配 Map[String, Int] 中的 Scala 类型删除

python - python列表的问题

python - 在 Python 3.4 中生成具有重复项的随机数的随机列表

java - 创建列表深拷贝

python - 在 Python 中生成多个文件的一个 MD5/SHA1 校验和

python - 如何将表示字节的 Python 字符串转换为实际字节?

Python:如何从另一个文件夹导入脚本,该文件夹也在本地导入具有相对路径/本地文本文件的其他脚本?

ios - 如何从字符串中的json获取数组响应?

python - 空路径与这些中的任何一个都不匹配

java - 加载不同的 map