簡體   English   中英

為每個唯一值創建列表

[英]Create list for each unique value

我目前正在查看具有以下結構的表。

uid | action
 1  |   A1
 1  |   A1
 1  |   A1
 1  |   A4
 2  |   A1
 2  |   A8
 2  |   A9
 3  |   A3
 3  |   A7

我正在嘗試使用以下結構創建多維數組。

[[A1, A1, A1, A4], [A1, A8, A9], [A3, A7]] 

我的想法是跟蹤uid ,並將操作附加到列表中,直到uid鍵更改為止。 一旦uid鍵確實更改,所有操作將被追加到另一個數組,並且被跟蹤的uid將更改為新的uid

我已經使用itertools.groupby()提出了一個過於誇張和不正確的解決方案,但我對此並不滿意,並且正在尋找更簡單的方法。 但是,我已經解決了這個問題,並提出了更復雜的解決方案。

任何提示將不勝感激。

碼:

data = []
for i, j in itertools.groupby(table, key=lambda x: x['uid']):
    event_array = []
    for k in list(j):
        event_array.append(k['action'])
    data.append([i, event_array])

根據OP的評論

@Black您確定數據已訂購嗎?

... @thefourtheye,是的,可以肯定的是,在將其讀入python之前,我必須先在sql中編寫它

例如,由於數據已經排序

>>> data = [{'action': 'A1', 'uid': 1},
...  {'action': 'A1', 'uid': 1},
...  {'action': 'A1', 'uid': 1},
...  {'action': 'A4', 'uid': 1},
...  {'action': 'A1', 'uid': 2},
...  {'action': 'A8', 'uid': 2},
...  {'action': 'A9', 'uid': 2},
...  {'action': 'A3', 'uid': 3},
...  {'action': 'A7', 'uid': 3}]

您可以像使用嵌套列表一樣簡單地使用groupby本身

>>> [[k['action'] for k in j] for i, j in groupby(data, key=lambda x: x['uid'])]
[['A1', 'A1', 'A1', 'A4'], ['A1', 'A8', 'A9'], ['A3', 'A7']]

您可以使用舊的defaultdict

from collections import defaultdict

DATA = [{'uid': uid, 'action': action}
        for uid, action in [(1, 'A1'),
                            (1, 'A1'),
                            (1, 'A1'),
                            (1, 'A4'),
                            (2, 'A1'),
                            (2, 'A8'),
                            (2, 'A9'),
                            (3, 'A3'),
                            (3, 'A7'),]]

d = defaultdict(list)

for data in DATA:
    d[data['uid']].append(data['action'])

print(d.values())

結果將是:

[['A1', 'A1', 'A1', 'A4'], ['A1', 'A8', 'A9'], ['A3', 'A7']]

這應該可以工作,但是groupby看起來已經非常不錯了。

uids = {}
for row in table:
    uids.setdefault(row['uid'], []).append(row['action'])

data = [uids[uid] for uid in sorted(uids.keys())]

該解決方案只是簡單地遍歷table每一行,並確保在uids dict中存在對應uid的列表(使用setdefault )。 然后,它將針對該行的操作附加到列表中。

因此, uids將是一個字典,其鍵是UID,值是表中相應動作的序列。

如果你真的想要一個列表的列表(一個“多維數組”),最后一行使用列表理解來構建其元素存儲在行動的清單列表uids字典,通過UID排序。

暫無
暫無

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

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