Python - 将列表添加到dict(初学者)

时间:2016-03-01 21:52:48

标签: python list dictionary

我对编程非常陌生(现在开始学习我的第一堂课),所以请关注我的格式问题和误解,或者错过简单的修复。

我有一个带有推文数据的词典:'user'作为键,然后'text'作为它们的值。我的目标是找到他们回复另一个用户的推文,以@符号开头表示,然后创建一个包含作者用户和他回复的每个用户的新词典。这是我在下面的相当简单的陈述。我还能够使用split函数来隔离他们回复的人的用户名(该函数接受@符号和后面的下一个空格之间的所有文本)。

st='@'
en=' '
task1dict={}
for t in a,b,c,d,e,f,g,h,i,j,k,l,m,n:
    if t['text'][0]=='@':
        user=t['user']
        repliedto=t['text'].split(st)[-1].split(en)[0]
        task1dict[user]=[repliedto]

Username1回复了username2。 Username2回复了username3和username5。

我正在尝试创建一个类似于:

的字典(caled tweets1)
'user':'repliedto'
username1:[username2]
username2:[username3, username5]

有没有更好的方法来隔离用户名,然后将它们放入新的dict中?以下是推文数据的2个条目样本:

{"user":"datageek88","text":"@sundevil1992 good question! @joeclarknet Is this on the exam?"},
{"user":"joeclarkphd","text":"Exam questions will be answered in due time @sundevil1992"}

我现在可以将它们添加到dict中,但它只会为每个'用户'保存一个'repliedto',所以不是显示username2已经回复了3和5,它只显示最新的一个,5 :

{'username1': ['username2'],
'username2': ['username5']}

再说一遍,如果我在这里做任何严肃的禁忌,我道歉,请告诉我我做错了什么!

2 个答案:

答案 0 :(得分:0)

将最后一行修改为

 task1dict.setdefault(user, [])
 task1dict[user].append (repliedto)

每次编辑时,您都会覆盖回复数组的用户。 setdefault方法将dict设置为具有空列表(如果它尚不存在)。然后只需附加到列表中。

编辑:使用一组唯一性的相同代码。

 task1dict.setdefault(user, set())
 task1dict[user].add (repliedto)

对于集合,您可以向集合添加元素。而您附加到列表的列表

答案 1 :(得分:0)

我可能会这样做。使用以下正则表达式来标识所有用户名。

r"@([^\s]*)"

这意味着查找@符号,然后返回所有不是空格的字符。 defaultdict只是一个字典,如果找不到键,则返回默认值。在这种情况下,如果我们要添加新密钥,则指定空set作为返回类型。

import re
from collections import defaultdict
tweets = [{"user":"datageek88","text":"@sundevil1992 good question! @joeclarknet Is this on the exam?"},
{"user":"joeclarkphd","text":"Exam questions will be answered in due time @sundevil1992"}]

from_to = defaultdict(set)
for tweet in tweets:
    if "@" in tweet['text']:
        user = tweet['user']
        for replied_to in re.findall(r"@([^\s]*)", tweet['text']):
            from_to[user].add(replied_to)

print from_to

输出

defaultdict(<type 'list'>, {'joeclarkphd': ['sundevil1992'], 
'datageek88': ['sundevil1992', 'joeclarknet']})
相关问题