Python - 如何通过仅保留最新的元组来重复删除元组列表。

时间:2014-12-19 02:29:56

标签: python datetime twitter

我有一个数据集,其中每条记录包含用户推文的日期,屏幕名称,关注者数量和朋友数。用户可以在整个数据集中多次列出,并且在不同时间以及在不同时间具有不同的关注者/朋友计数。我想要做的是获取列表中的唯一用户列表及其最近关注者/朋友计数。我不想只是在屏幕名称上删除重复,而是我想要他们最近的值。

这是我的数据目前的重复值

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]))

现在我需要弄清楚如何为数据集中的每个唯一用户获取MOST RECENT值集。我不确定for循环是否是最好的方式,或者其他东西会更好。

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)]

5 个答案:

答案 0 :(得分:1)

您可以在groupby模块中使用itertools功能:

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)]

答案 1 :(得分: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)

答案 2 :(得分: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)

答案 3 :(得分: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中提到的方法。

答案 4 :(得分: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)}