2014-12-19 82 views
2

我有一個數據集,其中每個記錄包含用戶推文日期,他們的屏幕名稱,他們的追隨者數量和他們的朋友數。用戶可以在整個數據集中多次列出,並且在不同的時間以及在不同的時間與不同的追隨者/朋友計數。我想要做的是獲得列表中的唯一用戶列表以及他們的最近的關注者/朋友數。我不想僅僅刪除他們的屏幕名稱,但我想要他們最近的值。Python - 如何通過保留最近的元組來重複刪除元組列表。

這是我的數據目前看起來像重複值

In [14]: data 
Out[14]: 
[(datetime.datetime(2014, 11, 21, 1, 16, 2), u'AlexMatosE', 773, 560), 
(datetime.datetime(2014, 11, 21, 1, 17, 6), u'hedofthebloom', 670, 618), 
(datetime.datetime(2014, 11, 21, 1, 18, 8), u'hedofthebloom', 681, 615), 
(datetime.datetime(2014, 11, 21, 1, 19, 1), u'jape2116', 263, 540), 
(datetime.datetime(2014, 11, 21, 1, 19, 3), u'_AlexMatosE', 790, 561), 
(datetime.datetime(2014, 11, 21, 1, 19, 5), u'Buffmuff69', 292, 270), 
(datetime.datetime(2014, 11, 21, 1, 20, 1), u'steveamodu', 140, 369), 
(datetime.datetime(2014, 11, 21, 1, 20, 9), u'jape2116', 263, 540), 
(datetime.datetime(2014, 11, 21, 1, 21, 3), u'chighway', 363, 767), 
(datetime.datetime(2014, 11, 21, 1, 22, 9), u'jape2116', 299, 2000)] 

這是我如何能得到獨特的用戶數據

In [15]: users = set(sorted([line[1] for line in data])) 

現在我需要找出如何獲取數據集中每個唯一用戶的最新最近值組。我不確定一個for-loop是否是去這裏的最佳方式,或者如果別的東西會更好。

In [18]: most_recent_user_data = [] 
    ....: for line in data: 
    ....:  if line[1] in users: 
    ....:   ... 
    ....:   ... 
    ....:   ... 
    ....:   most_recent_user_data.append((line[1], line[2], line[3])) 

最終,我想每一個獨特的用戶結束了一次,他們最近的追隨者/朋友看重

In [19]: most_recent_user_data 
Out[19]: 
(u'hedofthebloom', 681, 615), 
(u'_AlexMatosE', 790, 561), 
(u'Buffmuff69', 292, 270), 
(u'steveamodu', 140, 369), 
(u'chighway', 363, 767), 
(u'jape2116', 299, 2000)] 
+0

您是否嘗試過按用戶進行分組,按時間戳排序和gett最近的一個? – chapelo 2014-12-19 02:33:25

回答

0

的一種方法是使用字典和使用用戶名稱作爲關鍵字。對於每個密鑰,都會有一個用戶數據列表,您可以根據需要對其進行排序。以下是這樣做的一種方式:

from collections import defaultdict 

# move data to a dict 
dataDict = defaultdict(list) 

for v in data: 
    dataDict[v[1]] += [v] 

# sort user data for each user/key 
for u,v in dataDict.items(): 
    dataDict[u] = sorted(v, reverse=True) 

# get first (i.e. most recent) values for each user  
for u,v in dataDict.items(): 
    print(u,v[0][-2], v[0][-1])  

結果是:

(u'chighway', 363, 767) 
(u'AlexMatosE', 773, 560) 
(u'hedofthebloom', 681, 615) 
(u'steveamodu', 140, 369) 
(u'Buffmuff69', 292, 270) 
(u'_AlexMatosE', 790, 561) 
(u'jape2116', 299, 2000) 
0

使用字典來爲每個用戶存儲的最新數據。

latests = {} 
for d in data: 
    if d[0] > latests.setdefault(d[1], d)[0]: 
     latests[d[1]] = d 

results = [(d[1], d[2:]) for d in latests.values()] 
from pprint import pprint 
pprint(results) 
0

的另一種方式得到期望的結果:

from operator import itemgetter 

# sort the data using time as the key 
data.sort(key=itemgetter(0), reverse=True) 

# remove duplicated users from the data 
def uniq(seq): 
    seen = set() 
    seen_add = seen.add 
    return [(x[1], x[2], x[3]) for x in seq if not (x[1] in seen or seen_add(x[1]))] 

uniq(data) 

這給:

[('jape2116', 299, 2000), 
('chighway', 363, 767), 
('steveamodu', 140, 369), 
('Buffmuff69', 292, 270), 
('_AlexMatosE', 790, 561), 
('hedofthebloom', 681, 615), 
('AlexMatosE', 773, 560)] 

我使用this thread提到的方法。

1

可以在itertools模塊使用groupby功能:

import datetime 
import itertools 

data = [(datetime.datetime(2014, 11, 21, 1, 16, 2), u'AlexMatosE', 773, 560), 
     (datetime.datetime(2014, 11, 21, 1, 17, 6), u'hedofthebloom', 670, 618), 
     (datetime.datetime(2014, 11, 21, 1, 18, 8), u'hedofthebloom', 681, 615), 
     (datetime.datetime(2014, 11, 21, 1, 19, 1), u'jape2116', 263, 540), 
     (datetime.datetime(2014, 11, 21, 1, 19, 3), u'_AlexMatosE', 790, 561), 
     (datetime.datetime(2014, 11, 21, 1, 19, 5), u'Buffmuff69', 292, 270), 
     (datetime.datetime(2014, 11, 21, 1, 20, 1), u'steveamodu', 140, 369), 
     (datetime.datetime(2014, 11, 21, 1, 20, 9), u'jape2116', 263, 540), 
     (datetime.datetime(2014, 11, 21, 1, 21, 3), u'chighway', 363, 767), 
     (datetime.datetime(2014, 11, 21, 1, 22, 9), u'jape2116', 299, 2000)] 

# sorted record by name and datetime 
data = sorted(data, key=lambda x: (x[1], x[0]), reverse=True) 

# group by username and get the most recent user data 
most_recent_user_data = [[(lambda x: (x[1], x[2], x[3]))(next(v)) for k, v in itertools.groupby(data, key=lambda x: x[1])]] 

結果:

[('steveamodu', 140, 369), 
('jape2116', 299, 2000), 
('hedofthebloom', 681, 615), 
('chighway', 363, 767), 
('_AlexMatosE', 790, 561), 
('Buffmuff69', 292, 270), 
('AlexMatosE', 773, 560)] 
0

您在反向時間順序排序的數據集,並添加到字典或追加到只有列表中的第用戶出現的時間:

import datetime  
users = {} 
for d in reversed(data): 
    if d[1] not in users: users[d[1]] = tuple(d[2:]) 

# {'_AlexMatosE': (790, 561), 'steveamodu': (140, 369), 'jape2116': (299, 2000), 'chighway': (363, 767), 'AlexMatosE': (773, 560), 'hedofthebloom': (681, 615), 'Buffmuff69': (292, 270)} 
相關問題