0

我遇到了一个罕见的诚实至善的计算机科学问题(与通常的我如何制作这种语言相反,我不经常写 - 足够 - 做什么 - 我 -想要问题),并且真的觉得我缺乏CS学位来改变。

这有点混乱,因为我使用了几个列表的字典,但基本概念是这样的:一个 Twitter 抓取功能,将给定推文的转推添加到图形中,逐个节点,从原始向外构建作者(以追随者关系为边)。

for t in RTs_list:
g = nx.DiGraph()
followers_list=collections.defaultdict(list)
level=collections.defaultdict(list)
hoppers=collections.defaultdict(list)
retweets = []
retweeters = []
try:
    u = api.get_status(t)
    original_tweet = u.retweeted_status.id_str
    print original_tweet
    ot = api.get_status(original_tweet)
    node_adder(ot.user.id, 1)
    # Can't paginate -- can only get about ~20 RTs max. Need to work on small data here.
    retweets = api.retweets(original_tweet)
    for r in retweets:
        retweeters.append(r.user.id)
    followers_list["0"] = api.followers_ids(ot.user.id)[0]
    print len(retweets),"total retweets"
    level["1"] = ot.user.id
    g.node[ot.user.id]['crossover'] = 1
    if g.node[ot.user.id]["followers_count"]<4000:
        bum_node_adder(followers_list["0"],level["1"], 2)
    for r in retweets:
        rt_iterator(r,retweets,0,followers_list,hoppers,level)      
except:
    print ""

def rt_iterator(r,retweets,q,followers_list,hoppers,level):
q = q+1
if r.user.id in followers_list[str(q-1)]:
    hoppers[str(q)].append(r.user.id)
    node_adder(r.user.id,q+1)
    g.add_edge(level[str(q)], r.user.id)
    try:
        followers_list[str(q)] = api.followers_ids(r.user.id)[0]
        level[str(q+1)] = r.user.id
        if g.node[r.user.id]["followers_count"]<4000:
            bum_node_adder(followers_list[str(q)],level[str(q+1)],q+2)
            crossover = pull_crossover(followers_list[str(q)],followers_list[str(q-1)])
        if q<10:
            for r in retweets:
                rt_iterator(r,retweets,q,followers_list,hoppers,level)
    except:
        print ""

那里还有一些其他的函数调用,但它们与问题无关。主要问题是从(例如)2 跳节点到 3 跳节点时 Q 如何计数。我需要它为从中心的每个分支构建到最大深度 (10),而现在我相信它只是为它尝试的第一个分支构建到最大深度。希望这是有道理的。如果没有,在这里输入对我有帮助;我想我只是在某个地方错过了一个循环,但我很难看到。

另外,请忽略各种 dicts 引用 Q+1 或 Q-1,这是我在重构以使其递归之前如何实现它的工件。

谢谢!

4

2 回答 2

0

我不完全确定你所说的“中心”是什么意思,但我认为你想要这样的东西:

def rt_iterator(depth, other-args):
    # store whatever info you need from this point in the tree
    if depth>= MAX_DEPTH:
        return
    # look at the nodes you want to expand from here
    for each node, in the order you want them expanded:
        rt_iterator(depth+1, other-args)
于 2012-07-05T20:16:00.403 回答
0

想我已经修好了……这样 Q 在不应该增加的时候就不会增加。

def rt_iterator(r,retweets,q,depth,followers_list,hoppers,level):
def node_iterator (r,retweets,q,depth,followers_list,hoppers,level):
    for r in retweets:
        if r.user.id in followers_list[str(q-1)]:
            hoppers[str(q)].append(r.user.id)
            node_adder(r.user.id,q+1)
            g.add_edge(level[str(q)], r.user.id)
            try:
                level[str(q+1)] = r.user.id
                if g.node[r.user.id]["followers_count"]<4000:
                    followers_list[str(q)] = api.followers_ids(r.user.id)[0]
                    bum_node_adder(followers_list[str(q)],level[str(q+1)],q+2)
                    crossover = pull_crossover(followers_list[str(q)],followers_list[str(q-1)])
                if q<10:
                    node_iterator(r,retweets,q+1,depth,followers_list,hoppers,level)
            except:
                print ""
depth = depth+1
q = depth
if q<10:
    rt_iterator(r,retweets,q,depth,followers_list,hoppers,level)
于 2012-07-05T20:17:44.337 回答