我对编程非常陌生(现在开始学习我的第一堂课),所以请关注我的格式问题和误解,或者错过简单的修复。
我有一个带有推文数据的词典:'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']}
再说一遍,如果我在这里做任何严肃的禁忌,我道歉,请告诉我我做错了什么!
答案 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']})