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

时间:2008-11-29 13:40:06

标签: 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())这样的东西:如果它在那里,附加数据,如果没有创建将空列表作为字典值,然后在下一个循环中追加数据。

4 个答案:

答案 0 :(得分:72)

让我们来看看

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)代替简单字典{}

  4. 修改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 )
    

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

    <强> Setdefault

    初​​始化

    d= {}
    

    使用

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

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

    默认字典

    初​​始化

    import collections
    d = collections.defaultdict(list)
    

    使用

    d[t].append( c )
    

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

答案 1 :(得分:12)

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

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

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

答案 2 :(得分:1)

dict=[]  //it's not a dict, it's a list, the dictionary is dict={}
elem=[1,2,3]
dict.append(elem)

您可以通过以下方式访问单个元素:

print dict[0] // 0 is the index

输出将是:

[1, 2, 3]

答案 3 :(得分:1)

如果您的数据尚未按所需条件排序,则以下是可能有助于对数据进行分组的代码:

#!/usr/bin/env python
"""
$ cat data_shuffled.txt
0,2,7
1,4,7
0,4,7
1,9,0
1,2,5
0,6,7
1,6,8
0,9,5
"""
from itertools   import groupby
from operator    import itemgetter

# load the data and make sure it is sorted by the first column
sortby_key = itemgetter(0)
data = sorted((map(int, line.split(',')) for line in open('data_shuffled.txt')),
              key=sortby_key)

# group by the first column
grouped_data = []
for key, group in groupby(data, key=sortby_key):
    assert key == len(grouped_data) # assume the first column is 0,1, ...
    grouped_data.append([trio[1:] for trio in group])

# print the data
for i, pairs in enumerate(grouped_data):
    print i, pairs

输出:

0 [[2, 7], [4, 7], [6, 7], [9, 5]]
1 [[4, 7], [9, 0], [2, 5], [6, 8]]