2016-03-01 95 views
2

我对编程非常陌生(现在带上我的第一堂课),请耐心等待格式问题和误解,或者错过简单修复。Python - 将词表添加到词典中(初学者)

我有一个推特数据的词典:'用户'作为键,然后'文字'作为他们的价值观。我的目标是找到他们回复给其他用户的推文,以@符号开头表示,然后制作一个新的词典,其中包含作者的用户以及他回复的每个人的用户。如果我有以下陈述,那是相当简单的。我还能够使用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] 

用户名1回复到用户名2。 Username2回复了username3和username5。

我想创建一个字典(caled tweets1)读取类似:

'user':'repliedto' 
username1:[username2] 
username2:[username3, username5] 

是否有更好的方法来隔离的用户名,然后把它们放到一个新的字典?这里的鸣叫数据的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"} 

我现在能够将它们添加到字典,但它只能救一个“repliedto”为每个“用户”,这样反而显示USERNAME2已回答双方3和5,它只是显示最新的一个,5:

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

同样,如果我犯一个严重的在这里没有没有任何地方,我道歉,请告诉我我在做什么错误!

回答

0

最后一行修改到

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

你被覆盖用户回答阵列每次编辑它的时候。 setdefault方法会将字典设置为具有空列表,如果它尚不存在。然后只需追加到列表中。

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

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

对于您添加元素的集合。而你追加到清单

+0

真棒!它几乎完全是我想要的。但是,有没有简单的方法可以让它忽略重复?例如,username2在2个不同的时间回复到username5,所以它在task1dict中显示username5两次。 –

+0

是的。而不是使用列表。使用一套。一个集合就像列表,但它不能包含重复。我会修改我的答案 –

+0

完美 - 非常感谢。 –

0

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

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

这意味着查找@符号,然后返回所有不是空格的字符。 A 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']})