【问题标题】:Python--adding list into dict (beginner)Python--将列表添加到字典中(初学者)
【发布时间】:2016-06-14 13:01:47
【问题描述】:

我对编程很陌生(现在正在上我的第一堂课),所以请多多包涵格式问题和误解,或者缺少简单的修复方法。

我有一个带有推文数据的字典:“用户”作为键,然后“文本”作为它们的值。我的目标是找到他们回复另一个用户的推文,以@符号开头,然后创建一个包含作者用户和他回复的每个人的用户的新字典。这是我在下面的相当简单的 if 语句。我还能够使用 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。

我正在尝试创建一个 dict(称为 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"}

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

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

再一次,如果我在这里的任何地方都严重禁止,我道歉,并请告诉我我做错了什么!

【问题讨论】:

    标签: python list dictionary


    【解决方案1】:

    修改最后一行为

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

    每次编辑数组时,您都会覆盖用户回复数组。如果字典不存在,setdefault 方法会将字典设置为空列表。然后追加到列表中。

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

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

    对于一个集合,您将一个元素添加到集合中。而您附加到列表中的列表

    【讨论】:

    • 太棒了!它几乎完全符合我的要求。但是,有什么简单的方法可以让它忽略重复项?例如,username2 在 2 次不同时间回复了 username5,因此它在 task1dict 中显示了 username5 两次。
    • 是的。而不是使用列表。使用一套。集合类似于列表,但不能包含重复项。我会修改我的答案
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-28
      • 1970-01-01
      • 1970-01-01
      • 2014-09-09
      • 2014-03-07
      相关资源
      最近更新 更多