簡體   English   中英

在Python詞典中存儲和更新列表:為什么會發生這種情況?

[英]Storing and updating lists in Python dictionaries: why does this happen?

我有一個數據列表,如下所示:

// 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卻不起作用?

附言:我計划做的任何改進都會引起人們的極大興趣! 我想我必須通過輸入在每個循環上檢查字典,以查看字典鍵是否已經存在,我想通過使用類似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. 使用setdefault d.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 )

每個字典值都必須初始化為一些有用的結構。 在這種情況下,我們檢查密鑰是否存在。 當缺少密鑰時,我們創建密鑰並分配一個空列表。

默認設置

初始化

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方法將返回綁定到字典鍵t的元素(在我們的示例中為列表)(如果該鍵存在)。 如果沒有,它將一個空列表綁定到鍵t並將其返回。 因此,無論哪種方式,都將存在一個列表, .append方法可將其附加到元組c

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]

如果您的數據尚未按期望的標准排序,則以下代碼可能有助於對數據進行分組:

#!/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]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM