生成包含列表和dict理解的嵌套词典

2024-05-20 16:46:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用以下格式创建嵌套词典:

{person1:
         {tweet1 that person1 wrote: times that tweet was retweeted},
         {tweet2 that person1 wrote: times that tweet was retweeted},
 person2:
         {tweet1 that person2 wrote: times that tweet was retweeted},...
 }

我试图从以下数据结构创建它。以下是真实版本的截短版本。在

^{pr2}$

this SO question和{a2}似乎都不适用。在


Tags: 版本数据结构that格式词典tweettimeswas
3条回答

一个“人”和一个“tweet”似乎将成为拥有自己数据和功能的对象。你可以通过在一个类中把事情包装起来,在逻辑上把这个想法联系起来。例如:

class tweet(object):
    def __init__(self, text):
        self.text = text
        self.retweets = 0
    def retweet(self):
        self.retweets += 1
    def __repr__(self):
        return "(%i)" % (self.retweets)
    def __hash__(self):
        return hash(self.text)

class person(object):
    def __init__(self, name):
        self.name = name
        self.tweets = dict()

    def __repr__(self):
        return "%s : %s" % (self.name, self.tweets)

    def new_tweet(self, text):
        self.tweets[text] = tweet(text)

    def retweet(self, text):
        self.tweets[text].retweet()

M = person("mac389")
M.new_tweet('foo')
M.new_tweet('bar')
M.retweet('foo')
M.retweet('foo')

print M

会给出:

^{pr2}$

这里的优势是双重的。第一,与一个人或tweet相关的新数据是以一种明显且合乎逻辑的方式添加的。第二,你已经创建了一个很好的用户界面(即使你是唯一使用它的人!)从长远来看,这将使生活更轻松。在

Guido说,显式比隐式好

for_Nick = {}
for person,tweets in zip(rt_sources,retweets):
     if person not in for_Nick:
          for_Nick[person] = {}
          for tweet in list(set(tweets)):
               frequency = annotated_retweets[tweet]
               for_Nick[person][tweet] = frequency
     else: #Somehow person already in dictionary <  Shouldn't happen
         for tweet in tweets:
             if tweet in for_Nick[person]:
                  current_frequency = for_Nick[person][tweet]
                  incoming_frequency = annotated_retweets[tweet]
                  for_Nick[person][tweet] = current_frequency + incoming_frequency
             else: #Person is already there but he said something new
                frequency = annotated_retweets[tweet]
                for_Nick[person][tweet] = frequency

也许还有更优雅的形式。在

这可能是您试图构建的dict理解:

for_Nick = {person: 
               {tr: annotated_retweets[tr]
                for tr in set(tweet_record)} 
            for person, tweet_record in zip(rt_sources,retweets)}

您试图将一个键列表和一个值列表传递给dict构造函数,后者需要一个键-值对的列表(或其他iterable)。在

相关问题 更多 >